hdu 1698(区间更新线段树)Just a Hook

来源:互联网 发布:大石家具城怎么样 知乎 编辑:程序博客网 时间:2024/04/29 17:59

只更新到所需要的区间,然后返回。下次,如果,继续要用这段区间的儿子节点,那么,就把这段区间更新到下面的儿子节点。


#include <iostream>using namespace std;int sgTree[111115<<2];int col[111115<<2];void build(int l,int r,int c){if(l==r){sgTree[c]=1;col[c]=0;return;}int mid=(l+r)/2;build(l,mid,c*2);build(mid+1,r,c*2+1);sgTree[c]=sgTree[c*2]+sgTree[c*2+1];col[c]=0;     //刚开始,没有初始化0,wa了好多次。。。}void PushDown(int c,int l,int r){if(col[c]){col[c*2]=col[c];col[c*2+1]=col[c];int mid=(l+r)/2;sgTree[c*2]=(mid-l+1)*col[c];sgTree[c*2+1]=(r-mid)*col[c];col[c]=0;}}void update(int tl,int tr,int add,int l,int r,int c){if(l==tl&&tr==r){sgTree[c]=(r-l+1)*add;col[c]=add;          //更新一段区间,然后返回。return;}PushDown(c,l,r);         //区间向下更新int mid=(l+r)/2;if(tr<=mid) update(tl,tr,add,l,mid,c*2);else if(tl>mid) update(tl,tr,add,mid+1,r,c*2+1);else{update(tl,mid,add,l,mid,c*2);update(mid+1,tr,add,mid+1,r,c*2+1);}sgTree[c]=sgTree[c*2]+sgTree[c*2+1];}int main(){int n,q;int t;scanf("%d",&t);int x=1;while(t--){scanf("%d %d",&n,&q);build(1,n,1);for(int i=0;i<q;i++){int a,b,c;scanf("%d %d %d",&a,&b,&c);update(a,b,c,1,n,1);}printf("Case %d: The total value of the hook is %d.\n",x++,sgTree[1]);}return 0;}


原创粉丝点击