学长的模板非常好,我是来存模板的
区间修改若为赋值型的,则将lazy作赋值运算
区间修改若为增值型的,则将lazy作增值运算
代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ls o<<1
#define rs o<<1|1
#define lson L,mid,ls
#define rson mid+1,R,rs
#define mdzz int mid=(L+R)>>1;
int N,M;
int tree[400025];
int label[400025];
void pushup(int o){
tree[o]=tree[ls]+tree[rs];
}
void pushdown(int o,int k){
if(label[o])
{
label[ls]=label[o];
label[rs]=label[o];
tree[ls]=label[o]*(k-(k>>1));
tree[rs]=label[o]*(k>>1);
label[o]=0;
}
}
void build(int L,int R,int o){//建树
if(L==R){
tree[o]=1;
return;
}
mdzz;
build(lson);
build(rson);
pushup(o);
}
/*void update(int p,int L,int R,int o,int v){ //点修改
if(L==R){
tree[o]=v;
return;
}
pushdown(o);
mdzz;
if(p<=mid) update(p,lson,v);
else update(p,rson,v);
pushup(o);
}*/
void update(int l,int r,int L,int R,int o,int v){//[l,r]区间修改
if(l<=L&&R<=r){
label[o]=v;
tree[o]=v*(R-L+1);
return;
}
pushdown(o,R-L+1);
mdzz;
if(l<=mid) update(l,r,lson,v);
if(r>mid) update(l,r,rson,v);
pushup(o);
}
/*long long query(int l,int r,int L,int R,int o){//[l,r]区间询问
if(r>=R&&l<=L) return tree[o];
pushdown(o,R-L+1);
mdzz;
long long ans=0;
if(l<=mid)
ans+=query(l,r,lson);
if(r>mid)
ans+=query(l,r,rson);
return ans;
}*/
/*int query(int p,int L,int R,int o){//点询问
if(L==R) return 0;
pushdown(o);
mdzz;
if(p<=mid) return query(p,lson);
else return query(p,rson);
}*/
int main()
{
int T;
scanf("%d",&T);
char s;
int a,b,z;
int cas=1;
while(T--)
{
memset(label,0,sizeof label);
memset(tree,0,sizeof tree);
scanf("%d%d",&N,&M);
build(1,N,1);
for(int i=0;i<M;i++)
{
scanf("%d%d%d",&a,&b,&z);
update(a,b,1,N,1,z);
}
printf("Case %d: The total value of the hook is %d.\n",cas++,tree[1]);
}
return 0;
}