题目链接: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 }