带延时标记的线段树
代码如下
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=100005;
int sum[maxn*4];
int lazy[maxn*4];
int x,y,z;
void Build(int o,int l,int r)
{
lazy[o]=0;
if(l==r) {
sum[o]=1; return ;
}
int mid=l+r>>1;
Build(o<<1,l,mid);
Build(o<<1|1,mid+1,r);
sum[o]=sum[o<<1]+sum[o<<1|1];
}
void push_down(int o,int l,int r)
{
if(lazy[o]) {
lazy[o<<1]=lazy[o<<1|1]=lazy[o];
int mid=l+r>>1;
sum[o<<1]=(mid-l+1)*lazy[o];
sum[o<<1|1]=(r-mid)*lazy[o];
lazy[o]=0;
}
return ;
}
void Update(int o,int l,int r)
{
if(x<=l&&r<=y) {
lazy[o]=z; sum[o]=(r-l+1)*lazy[o]; return ;
}
push_down(o,l,r);
int mid=l+r>>1;
if(x<=mid) {
Update(o<<1,l,mid);
}
if(y>mid) {
Update(o<<1|1,mid+1,r);
}
sum[o]=sum[o<<1]+sum[o<<1|1];
}
int main()
{
int t;
scanf("%d",&t);
int cnt=0;
while(t--) {
cnt++;
int n,q;
scanf("%d",&n);
Build(1,1,n);
scanf("%d",&q);
while(q--) {
scanf("%d%d%d",&x,&y,&z);
Update(1,1,n);
}
printf("Case %d: The total value of the hook is %d.\n",cnt,sum[2]);
}
}