题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1698
解题思路
区间修改,区间查询。
这个被查询的区间不是别人,正是全部1~n。
板子题,不会线段树可以看看专栏的第一篇题解内的线段树讲解链接。
AC代码
#include<iostream> #include<cstdio> #include<cstring> #define ll long long using namespace std; const int N=1e5+10; struct TREE { int l,r,lazy,sum; }tree[N<<2]; int T,n,q,x,y,z,cas; void Build(int i,int l,int r) { tree[i].l=l; tree[i].r=r; tree[i].lazy=0; tree[i].sum=0; if(tree[i].l==tree[i].r) { tree[i].sum=1; return ; } int mid=(l+r)>>1; Build(i<<1,l,mid); Build(i<<1|1,mid+1,r); tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum; return ; } void PushDown(int i) { if(tree[i].lazy==0) return ; tree[i<<1].lazy=tree[i].lazy; tree[i<<1|1].lazy=tree[i].lazy; tree[i<<1].sum=(tree[i<<1].r-tree[i<<1].l+1)*tree[i].lazy; tree[i<<1|1].sum=(tree[i<<1|1].r-tree[i<<1|1].l+1)*tree[i].lazy; tree[i].lazy=0; return ; } void Update(int i,int l,int r,int c) { if(l<=tree[i].l && tree[i].r<=r) { tree[i].lazy=c; tree[i].sum=(tree[i].r-tree[i].l+1)*c; return ; } PushDown(i); if(tree[i<<1].r>=l) Update(i<<1,l,r,c);//left if(tree[i<<1|1].l<=r) Update(i<<1|1,l,r,c); tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum; } int main() { scanf("%d",&T); while(T--) { cas++; scanf("%d%d",&n,&q); Build(1,1,n); while(q--) { scanf("%d%d%d",&x,&y,&z); Update(1,x,y,z); } printf("Case %d: The total value of the hook is %d.\n",cas,tree[1].sum); } }