一道线段树 懒人标记的模板题 虽然我wa了很多发,因为我忘记把懒人标记清0,并且因为这是多次更改区间,所以更新区间的时候也需要下放懒标 询问答案的时候也需要下放懒标即可

​Just a hook​​ AC代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=1e6+5;
struct node
{
int l,r,sum;
int lazy;

} tree[maxn*4];
void pushup(int k)
{
tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;
}
void pushdown(int k)
{
if(tree[k].l==tree[k].r)
{
tree[k].lazy=0;
return ;
}
if(tree[k].lazy)
{
tree[k<<1].lazy=tree[k].lazy;
tree[k<<1|1].lazy=tree[k].lazy;
tree[k<<1].sum=(tree[k<<1].r-tree[k<<1].l+1)*tree[k].lazy;
tree[k<<1|1].sum=(tree[k<<1|1].r-tree[k<<1|1].l+1)*tree[k].lazy;
tree[k].lazy=0;
}
}
void build(int k,int l,int r)
{
tree[k].l=l;
tree[k].r=r;
tree[k].lazy=0;
if(l==r)
{

tree[k].sum=1;
return ;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
pushup(k);
}
void update(int k,int l,int r,int w)
{
if(tree[k].l==l&&tree[k].r==r)
{
tree[k].sum=(r-l+1)*w;
tree[k].lazy=w;
return;
}
pushdown(k);//由于多次更新需要在更新的时候记录
int mid=(tree[k].l+tree[k].r)>>1;
if(mid>=r)
{
update(k<<1,l,r,w);
}
else if(mid<l)
{
update(k<<1|1,l,r,w);
}
else
{
update(k<<1,l,mid,w);
update(k<<1|1,mid+1,r,w);
}
pushup(k);
}
int query(int k,int l,int r)
{
if(tree[k].lazy)
{
pushdown(k);
}
if(tree[k].l>=l&&tree[k].r<=r)
{
return tree[k].sum;
}
int mid=(tree[k].l+tree[k].r)>>1;
if(mid>=r)
{
return query(k<<1,l,r);
}
else if(mid<l)
{
return query(k<<1|1,l,r);
}
else
{
return query(k<<1,l,mid)+query(k<<1|1,mid+1,r);
}
}
int main()
{
int t;
scanf("%d",&t);
int id=0;
while(t--)
{
int n,op;
scanf("%d",&n);
build(1,1,n);
//printf("%d\n",query(1,1,n));
scanf("%d",&op);
while(op--)
{
int l,r,w;
scanf("%d %d %d",&l,&r,&w);
update(1,l,r,w);
//printf("%d\n",query(1,1,n));
}
int ans=query(1,1,n);
printf("Case %d: The total value of the hook is %d.\n",++id,ans);
}
}