(d) hdu1698 (区间修改)
Posted lsy263
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(d) hdu1698 (区间修改)相关的知识,希望对你有一定的参考价值。
如在阅读本文时遇到不懂的部分,请在评论区询问,或跳转 线段树总介绍
注意一开始整个区间都是1
此题过水不予讲解
代码
/*hdu1698*/ #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; const int N=2e7+3; int T,n,m; int tag[N<<2],v[N<<2]; #define mid (l+r>>1) #define ls (rt<<1) #define rs (ls|1) #define pushup(rt) v[rt]=v[ls]+v[rs] void build(int rt,int l,int r) tag[rt]=0; if(l==r)v[rt]=1;return; build(ls,l,mid);build(rs,mid+1,r); pushup(rt); void pushdown(int rt,int l,int r) tag[ls]=tag[rt],tag[rs]=tag[rt]; v[ls]=(mid-l+1)*tag[rt]; v[rs]=(r-mid)*tag[rt]; tag[rt]=0; void update(int rt,int l,int r,int x,int y,int z) if(x<=l&&y>=r)tag[rt]=z;v[rt]=(r-l+1)*z;return; if(tag[rt])pushdown(rt,l,r); if(x<=mid)update(ls,l,mid,x,y,z); if(y>mid)update(rs,mid+1,r,x,y,z); pushup(rt); int Case=0; int main() scanf("%d",&T); while(T--) scanf("%d%d",&n,&m); //build(1,1,n); update(1,1,n,1,n,1); int x,y,z; while(m--) scanf("%d%d%d",&x,&y,&z); update(1,1,n,x,y,z); printf("Case %d: The total value of the hook is %d.\\n",++Case,v[1]); return 0;
End
以上是关于(d) hdu1698 (区间修改)的主要内容,如果未能解决你的问题,请参考以下文章
HDU - 1698 Just a Hook(线段树区间整体修改值,查询区间和)
HDU - 1698 Just a Hook (线段树区间修改)