线段树 (区间修改 区间查询 延迟标记)

hdu 1698 Just a Hook题意: 给你一链子,这天链子由金银铜三种钩子组成,每种钩子都有自己的价值,起初,这条钩子全部由铜钩子组成,给你两个数n(钩子的个数),,Q(操作的个数)每次操作就是将给定区间里的数变成某种钩子,求这条链子的总价值。分析: 线段树模版题,处理好延迟标记即可。代码:;const int maxn=100005;int A[maxn];int sum[maxn<<2];int lazy[maxn<<2];void PushUp(int rt){sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void PushDown(int rt,int len){if(lazy[rt]){lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt];sum[rt<<1]=(len-(len>>1))*lazy[rt];sum[rt<<1|1]=(len>>1)*lazy[rt];lazy[rt]=0;}}void Build(int l,int r,int rt){sum[rt]=1;lazy[rt]=0;if(l==r) return ;int mid=l+r>>1;Build(lson);Build(rson);PushUp(rt);}void Update(int ll,int rr,int c,int l,int r ,int rt){if(ll<=l&&rr>=r){lazy[rt]=c;sum[rt]=(r-l+1)*c;return ;}PushDown(rt,r-l+1);int mid=l+r>>1;if(ll<=mid) Update(ll,rr,c,lson);if(rr>mid) Update(ll,rr,c,rson);PushUp(rt);}int main(){#ifndef ONLINE_JUDGEfreopen(“in.cpp”,”r”,stdin);#endif // ONLINE_JUDGEint T,i;cin>>T; for(i=1;i<=T;i++){int n;scanf(“%d”,&n);Build(root);int Q;scanf(“%d”,&Q);while(Q–){int l, r, z;scanf(“%d%d%d”,&l,&r,&z);Update(l,r,z,root);}printf(“Case %d: The total value of the hook is %d.\n”,i,sum[1]);}return 0;}

为我祈祷平安就好。我的旅行,会有你们的故事陪伴,所以我不会孤单。放心吧。

线段树 (区间修改 区间查询 延迟标记)

相关文章:

你感兴趣的文章:

标签云: