简单题。。。。区间更新 查找节点。。。。lazy思想想了好长时间,弄懂了。。果然很强大。。。
#include<cstdio> #include<cstring> #include<iostream> using namespace std; #define N 400010 #define LL(x) (x<<1) #define RR(x) (x<<1|1) struct node{ int L,R,sum,col; }edge[N]; void pushdown(int i,int m){ edge[LL(i)].col=edge[RR(i)].col=edge[i].col; edge[LL(i)].sum=edge[i].col*(m-(m>>1)); edge[RR(i)].sum=edge[i].col*(m>>1); edge[i].col=0; } int buit(int l,int r,int i){ edge[i].L=l,edge[i].R=r,edge[i].col=0; if(l==r) return edge[i].sum=1; int mid=(l+r)>>1; return edge[i].sum=buit(l,mid,LL(i))+buit(mid+1,r,RR(i)); } void updata(int l,int r,int i,int x){ if(l<=edge[i].L && edge[i].R<=r){ edge[i].col=x,edge[i].sum=x*(edge[i].R-edge[i].L+1); return; } if(edge[i].col) pushdown(i,edge[i].R-edge[i].L+1); int mid=(edge[i].L+edge[i].R)>>1; if(l<=mid) updata(l,r,LL(i),x); if(r>mid) updata(l,r,RR(i),x); edge[i].sum=edge[LL(i)].sum+edge[RR(i)].sum; } int main(){ int cas,n,m,x,y,u; scanf("%d",&cas); for(int t=1;t<=cas;t++){ scanf("%d%d",&n,&m); buit(1,n,1); while(m--){ scanf("%d%d%d",&x,&y,&u); updata(x,y,1,u); } printf("Case %d: The total value of the hook is %d.\n",t,edge[1].sum); } return 0; }