标签:
Description
Input
Output
Sample Input
Sample Output
Source
一般的线段树区间修改。但是这题有个坑处,就是区间值是直接替换而非增加值,所以pushdown的时候一定要把子节点的值也更新。←因为这个被坑了半小时青春
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #define ls l,mid,rt<<1 7 #define rs mid+1,r,rt<<1|1 8 using namespace std; 9 const int mxn=200000; 10 int n,m; 11 int ans=0; 12 struct tree{ 13 int sum; 14 int add; 15 }tr[mxn*4]; 16 void Build(int l,int r,int rt){ 17 if(l==r){ 18 tr[rt].sum=1; 19 tr[rt].add=0; 20 return; 21 } 22 int mid=(l+r)>>1; 23 Build(ls); 24 Build(rs); 25 tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum; 26 return; 27 } 28 void change(int L,int R,int x,int l,int r,int rt){ 29 if(tr[rt].add){ 30 int mid=(l+r)>>1; 31 tr[rt<<1].sum=(mid-l+1)*tr[rt].add;//更新下面的值很重要! 32 tr[rt<<1|1].sum=(r-mid)*tr[rt].add;//更新! 33 tr[rt<<1].add=tr[rt<<1|1].add=tr[rt].add; 34 tr[rt].add=0; 35 } 36 if(L<=l && r<=R){ 37 tr[rt].sum=(r-l+1)*x; 38 tr[rt].add=x; 39 return; 40 } 41 int mid=(l+r)>>1; 42 if(L<=mid)change(L,R,x,ls); 43 if(R>mid)change(L,R,x,rs); 44 tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum; 45 return; 46 } 47 48 int main(){ 49 int T; 50 scanf("%d",&T); 51 for(int ro=1;ro<=T;ro++){ 52 memset(tr,0,sizeof tr); 53 scanf("%d",&n); 54 Build(1,n,1); 55 scanf("%d",&m); 56 int i,j; 57 int x,y,z; 58 for(i=1;i<=m;i++){ 59 scanf("%d%d%d",&x,&y,&z); 60 change(x,y,z,1,n,1); 61 } 62 printf("Case %d: The total value of the hook is %d.\n",ro,tr[1].sum); 63 64 } 65 return 0; 66 }
标签:
原文地址:http://www.cnblogs.com/SilverNebula/p/5652337.html