今天的难度又增加了,在好不容易把练习A了以后,才发现,昨天的题根本就不叫题,我一口气刷得就剩一题了。只能说,攻克变态题的方法,就是去做更变态的题,然后原来的题就不变态了……
今天的作业,我的收获是,change、pushdown等涉及数据的函数的关键内容,是要随题目变化的。
1 #include <stdio.h> 2 const int N = 100005; 3 long long sum[4*N]; 4 long long add[4*N]; 5 int D; 6 void update(int cur) 7 { 8 sum[cur] = sum[cur<<1] + sum[cur<<1|1]; 9 } 10 void pushdown(int cur, int x, int y) 11 { 12 int mid=(x+y)>>1,lc = cur<<1,rc = lc|1; 13 if(add[cur]) 14 { 15 add[lc] += add[cur]; 16 add[rc] += add[cur]; 17 sum[lc] += add[cur] *(mid-x+1); 18 sum[rc] += add[cur] *(y - mid); 19 add[cur] = 0; 20 } 21 } 22 void build(int cur,int x,int y) 23 { 24 int mid=(x+y)>>1,lc = cur<<1,rc = lc|1; 25 if(x == y) 26 { 27 add[cur] = 0; 28 return ; 29 } 30 build(lc,x,mid); 31 build(rc,mid+1,y); 32 update(cur); 33 } 34 void query(int cur,int x,int y,int s,int t,long long & ans) 35 { 36 int mid=(x+y)>>1,lc = cur<<1,rc = lc|1; 37 if(x >= s && y <= t) 38 { 39 ans += sum[cur]; 40 return ; 41 } 42 pushdown(cur,x,y); 43 if(s <= mid) 44 query(lc,x,mid,s,t,ans); 45 if(t >= mid+1) 46 query(rc,mid+1,y,s,t,ans); 47 } 48 void Add(int cur,int x,int y,int s,int t,int v) 49 { 50 int mid=(x+y)>>1,lc = cur<<1,rc = lc|1; 51 if(x >= s && y <= t) 52 { 53 add[cur] += v; 54 sum[cur] += v * (y-x+1); 55 return ; 56 } 57 pushdown(cur,x,y); 58 if(s <= mid) 59 Add(lc,x,mid,s,t,v); 60 if(t >= mid+1) 61 Add(rc,mid+1,y,s,t,v); 62 update(cur); 63 } 64 int main() 65 { 66 int m,n,i,x,y,v; 67 long long ans; 68 char ch; 69 while(~scanf("%d%d",&n,&m)) 70 { 71 for(D = 1; D < n; D <<= 1); 72 for(i = 0; i < n; i++) 73 scanf("%lld",&sum[D+i]); 74 //for(i = 1; i <= n; i++) 75 //cin>>a[i]; 76 build(1,1,D); 77 while(m--) 78 { 79 getchar(); 80 scanf("%c",&ch); 81 if(ch == 'Q') 82 { 83 ans = 0; 84 scanf("%d%d",&x,&y); 85 query(1,1,D,x,y,ans); 86 printf("%lld\n",ans); 87 } 88 else 89 { 90 scanf("%d%d%d",&x,&y,&v); 91 Add(1,1,D,x,y,v); 92 } 93 } 94 } 95 return 0; 96 }
今天又偷懒了,一到晚上就开始玩,想做题也没状态了,希望下次能改吧。