• Transformation(线段树+HDU4578+多种操作+鬼畜的代码)


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578

    题目:

    题意:n个数初始值为0,进行四种操作:1.将区间内的数字加c;2.将区间内的数字乘c;3.将区间内的数字变成c;4.询问区间内的元素的p次方和。

    思路:这个题真的肝到死,找bug贼难受。我们用cnt1来记录一次方和,cnt2记录二次方和,cnt3记录三次方和。

    代码实现如下:

      1 #include <set>
      2 #include <map>
      3 #include <queue>
      4 #include <stack>
      5 #include <cmath>
      6 #include <bitset>
      7 #include <cstdio>
      8 #include <string>
      9 #include <vector>
     10 #include <cstdlib>
     11 #include <cstring>
     12 #include <iostream>
     13 #include <algorithm>
     14 using namespace std;
     15 
     16 typedef long long ll;
     17 typedef unsigned long long ull;
     18 
     19 #define lson i<<1
     20 #define rson i<<1|1
     21 #define bug printf("*********
    ");
     22 #define FIN freopen("D://code//in.txt", "r", stdin);
     23 #define debug(x) cout<<"["<<x<<"]" <<endl;
     24 #define IO ios::sync_with_stdio(false),cin.tie(0);
     25 
     26 const double eps = 1e-8;
     27 const int mod = 10007;
     28 const int maxn = 1e5 + 7;
     29 const double pi = acos(-1);
     30 const int inf = 0x3f3f3f3f;
     31 const ll INF = 0x3f3f3f3f3f3f3f3f;
     32 
     33 inline int read() {//读入挂
     34     int ret = 0, c, f = 1;
     35     for(c = getchar(); !(isdigit(c) || c == '-'); c = getchar());
     36     if(c == '-') f = -1, c = getchar();
     37     for(; isdigit(c); c = getchar()) ret = ret * 10 + c - '0';
     38     if(f < 0) ret = -ret;
     39     return ret;
     40 }
     41 
     42 int n, q, op, x, y, z;
     43 
     44 struct node {
     45     int l, r;
     46     ll cnt1, cnt2, cnt3, lazy1, lazy2, lazy3, len; //cnt1=siga(ax+b), cnt2=sigs(ax+b)^2,cnt3=siga(ax+b)^3
     47     //lazy1标记加b,lazy2标记乘a,lazy3标记赋值c
     48 }segtree[maxn*4];
     49 
     50 void push_up(int i) {
     51     segtree[i].cnt1 = (segtree[lson].cnt1 + segtree[rson].cnt1) % mod;
     52     segtree[i].cnt2 = (segtree[lson].cnt2 + segtree[rson].cnt2) % mod;
     53     segtree[i].cnt3 = (segtree[lson].cnt3 + segtree[rson].cnt3) % mod;
     54 }
     55 
     56 void push_down(int i){
     57   if(segtree[i].lazy3){
     58     ll tmp = segtree[i].lazy3*segtree[i].lazy3%mod*segtree[i].lazy3%mod;
     59     segtree[lson].lazy1=segtree[rson].lazy1=0;
     60     segtree[lson].lazy2=segtree[rson].lazy2=1;
     61     segtree[lson].lazy3=segtree[rson].lazy3=segtree[i].lazy3;
     62 
     63     segtree[lson].cnt3 = (segtree[lson].r - segtree[lson].l + 1)*tmp%mod;
     64     segtree[rson].cnt3 = (segtree[rson].r - segtree[rson].l + 1)*tmp%mod;
     65 
     66     segtree[lson].cnt2 =(segtree[lson].r - segtree[lson].l + 1)*segtree[i].lazy3%mod*segtree[i].lazy3%mod;
     67     segtree[rson].cnt2 = (segtree[rson].r - segtree[rson].l + 1)*segtree[i].lazy3%mod*segtree[i].lazy3%mod;
     68 
     69     segtree[lson].cnt1 =(segtree[lson].r - segtree[lson].l + 1)*segtree[i].lazy3%mod;
     70     segtree[rson].cnt1 = (segtree[rson].r - segtree[rson].l + 1)*segtree[i].lazy3%mod;
     71 
     72 
     73     segtree[i].lazy3 = 0;
     74   }
     75   if(segtree[i].lazy1!=0||segtree[i].lazy2!=1){
     76     ll add = segtree[i].lazy1, mul = segtree[i].lazy2;
     77     ll l1=segtree[lson].cnt1,l2=segtree[lson].cnt2,l3=segtree[lson].cnt3;
     78     ll r1=segtree[rson].cnt1,r2=segtree[rson].cnt2,r3=segtree[rson].cnt3;
     79     ll tmp = mul*mul%mod*mul%mod;
     80 
     81     segtree[lson].lazy1=(segtree[lson].lazy1*mul%mod+add)%mod;
     82     segtree[rson].lazy1=(segtree[rson].lazy1*mul%mod+add)%mod;
     83     segtree[lson].lazy2=segtree[lson].lazy2*mul%mod;
     84     segtree[rson].lazy2=segtree[rson].lazy2*mul%mod;
     85 
     86     segtree[lson].cnt3=(segtree[lson].cnt3*tmp%mod + add*add%mod*add%mod*(segtree[lson].r - segtree[i].l + 1)%mod + 3*segtree[lson].cnt2*mul%mod*mul%mod*add%mod + 3*segtree[lson].cnt1*mul%mod*add%mod*add%mod)%mod;   
     87     segtree[rson].cnt3=(segtree[rson].cnt3*tmp%mod + add*add%mod*add%mod*(segtree[rson].r - segtree[rson].l + 1)%mod + 3*segtree[rson].cnt2*mul%mod*mul%mod*add%mod + 3*segtree[rson].cnt1*mul%mod*add%mod*add%mod)%mod;
     88 
     89     segtree[lson].cnt2=(segtree[lson].cnt2*mul%mod*mul%mod + add*add%mod*(segtree[lson].r - segtree[i].l + 1)%mod + 2*mul*add*segtree[lson].cnt1)%mod;
     90     segtree[rson].cnt2=(segtree[rson].cnt2*mul%mod*mul%mod + add*add%mod*(segtree[rson].r - segtree[rson].l + 1)%mod + 2*mul*add*segtree[rson].cnt1)%mod;
     91 
     92     segtree[lson].cnt1=(segtree[lson].cnt1*mul+add*(segtree[lson].r - segtree[i].l + 1))%mod;
     93     segtree[rson].cnt1=(segtree[rson].cnt1*mul+add*(segtree[rson].r - segtree[rson].l + 1))%mod;
     94 
     95     segtree[i].lazy1 = 0;segtree[i].lazy2 = 1;
     96   }
     97 }
     98 
     99 void build(int i, int l, int r) {
    100     segtree[i].l = l, segtree[i].r = r;
    101     segtree[i].cnt1 = segtree[i].cnt2 = segtree[i].cnt3 = 0;
    102     segtree[i].lazy1 = segtree[i].lazy3 = 0;
    103     segtree[i].lazy2 = 1; 
    104     if(l == r) return;
    105     int mid = (l + r) >> 1;
    106     build(lson, l, mid);
    107     build(rson, mid + 1, r);
    108     push_up(i);
    109 }
    110 
    111 void update(int i, int l, int r, ll c, int op) {
    112     if(segtree[i].l == l && segtree[i].r == r) {
    113         if(op == 3) {
    114             segtree[i].cnt1 = c % mod * (segtree[i].r - segtree[i].l + 1) % mod;
    115             segtree[i].cnt2 = c * c % mod * (segtree[i].r - segtree[i].l + 1) % mod;
    116             segtree[i].cnt3 = c * c % mod * c % mod * (segtree[i].r - segtree[i].l + 1) % mod;
    117             segtree[i].lazy3 = c;
    118             segtree[i].lazy2 = 1;
    119             segtree[i].lazy1 = 0;
    120             return;
    121         } else if(op == 2) {
    122             segtree[i].cnt1 = c * segtree[i].cnt1 % mod;
    123             segtree[i].cnt2 = c * c % mod * segtree[i].cnt2 % mod;
    124             segtree[i].cnt3 = c * c % mod * c %mod * segtree[i].cnt3 % mod;
    125             segtree[i].lazy2 = segtree[i].lazy2 * c % mod;
    126             segtree[i].lazy1 = segtree[i].lazy1 * c % mod;
    127             return;
    128         } else {
    129             segtree[i].lazy1 = (c + segtree[i].lazy1) % mod;
    130             ll sum1 = segtree[i].cnt1, sum2 = segtree[i].cnt2, sum3 = segtree[i].cnt3;
    131             segtree[i].cnt1 = (sum1 + c * (segtree[i].r - segtree[i].l + 1)) % mod;
    132             segtree[i].cnt2 = ((sum2 % mod + 2 * c % mod * sum1 % mod) % mod + c * c % mod * (segtree[i].r - segtree[i].l + 1) % mod) % mod;
    133             segtree[i].cnt3 = ((sum3 % mod + 3 * c % mod * (sum2 + sum1 * c) % mod) % mod + c * c % mod * c * (segtree[i].r - segtree[i].l + 1) % mod) % mod;
    134             return;
    135         }
    136     }
    137     push_down(i);
    138     int mid = (segtree[i].l + segtree[i].r) >> 1;
    139     if(l > mid) update(rson, l, r, c, op);
    140     else if(r <= mid) update(lson, l, r, c, op);
    141     else {
    142         update(lson, l, mid, c, op);
    143         update(rson, mid + 1, r, c, op);
    144     }
    145     push_up(i);
    146 }
    147 
    148 ll query(int i, int l, int r, int op) {
    149     if(segtree[i].l == l && segtree[i].r == r) {
    150         if(op == 1) return segtree[i].cnt1;
    151         if(op == 2) return segtree[i].cnt2;
    152         if(op == 3) return segtree[i].cnt3;
    153     }
    154     push_down(i);
    155     int mid = (segtree[i].l + segtree[i].r) >> 1;
    156     if(l > mid) return query(rson, l, r, op);
    157     else if(r <= mid) return query(lson, l, r, op);
    158     else {
    159         return (query(lson, l, mid, op) + query(rson, mid + 1, r, op)) % mod;
    160     }
    161 }
    162 
    163 int main() {
    164     //FIN;
    165     while(~scanf("%d%d", &n, &q)) {
    166         if(n == 0 && q == 0) break;
    167         build(1, 1, n);
    168         while(q--) {
    169             scanf("%d%d%d%d", &op, &x, &y, &z);
    170             if(op == 4) {
    171                 printf("%lld
    ", query(1, x, y, z));
    172             } else {
    173                 z %= mod;
    174                 update(1, x, y, z, op);
    175             }
    176         }
    177     }
    178     return 0;
    179 }
  • 相关阅读:
    重磅!KubeEdge单集群突破10万边缘节点|云原生边缘计算峰会前瞻
    大型物联网平台如何来保障亿级设备安全连接上云?
    跟我学Python图像处理丨5种图像阈值化处理及算法对比
    什么是算子下盘?
    一文带你了解J.U.C的FutureTask、Fork/Join框架和BlockingQueue
    如何使用Superset可无缝对接MRS进行自助分析
    谁说Redis不能存大key
    云图说|每个成功的业务系统都离不开APIG的保驾护航
    手把手教你实战开发黑白棋实时对战游戏
    当运行npm install 命令的时候带上ignorescripts,会发生什么?
  • 原文地址:https://www.cnblogs.com/Dillonh/p/9375363.html
Copyright © 2020-2023  润新知