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 }
原文地址:https://www.cnblogs.com/Dillonh/p/9375363.html