一道线段树区间修改模板题,用lazy标记来减少对子节点的更新操作,由于最后是求总区间的价值和,所以都不用写 query 了,看别人有的用 map 写的一点点代码可以过,以后研究下。
以下是代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define N 400000
using namespace std;
int sum[N],lazy[N];
void pushup(int o)
{
sum[o]=sum[o*2]+sum[o*2+1];
}
void pushdown(int o,int L,int R)
{
int ls=o*2,rs=o*2+1,m=L+(R-L)/2;
if(lazy[o]!=0){
lazy[ls]=lazy[rs]=lazy[o];
sum[ls]=lazy[o]*(m-L+1);
sum[rs]=lazy[o]*(R-m);
lazy[o]=0;
}
}
void build(int o,int L,int R)
{
int ls=o*2,rs=o*2+1,m=L+(R-L)/2;
lazy[o]=0;
if(L==R){
sum[o]=1;
return ;
}
build(ls,L,m);
build(rs,m+1,R);
pushup(o);
}
void update(int o,int L,int R,int ul,int ur,int v)
{
int ls=o*2,rs=o*2+1,m=L+(R-L)/2;
if(ul<=L && ur>=R){
lazy[o]=v;
sum[o]=v*(R-L+1);
return ;
}
pushdown(o,L,R);
if(ul<=m) update(ls,L,m,ul,ur,v);
if(ur>m) update(rs,m+1,R,ul,ur,v);
pushup(o);
}
int main()
{
int T;
scanf("%d",&T);
int ca=1;
while(T--){
memset(lazy,0,sizeof(lazy));
memset(sum,0,sizeof(sum));
int n;
scanf("%d",&n);
build(1,1,n);
int q;
scanf("%d",&q);
for(int i=1;i<=q;i++){
int x,y,z;
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",ca++,sum[1]);
}
return 0;
}