线段树成段更新。。
采用延迟标记法
#include<iostream>
#include<algorithm>
using namespace std;
#define for if(0);else for
#define MAXN 100005
#define lson u<<1
#define rson u<<1|1
struct Node{
int lef,rig,sum;
int delta;//增加量
}T[MAXN<<2];
void Build(int u,int l,int r){
T[u].lef=l;
T[u].rig=r;
T[u].delta=0;
if(l==r){T[u].sum=1;return;}
int mid=(l+r)>>1;
Build(lson,l,mid);
Build(rson,mid+1,r);
T[u].sum=T[lson].sum+T[rson].sum;
}
void Update(int u,int l,int r,int v){
if(l<=T[u].lef&&T[u].rig<=r){
T[u].delta=v;
T[u].sum=(T[u].rig-T[u].lef+1)*v;
}
else {
if(T[u].delta){//如果u的delta不为0,那么久要将该delta传到u的左右节点中
T[lson].delta=T[u].delta;
T[rson].delta=T[u].delta;
T[lson].sum=(T[lson].rig-T[lson].lef+1)*T[u].delta;
T[rson].sum=(T[rson].rig-T[rson].lef+1)*T[u].delta;
T[u].delta=0;
}
if(r<=T[lson].rig)Update(lson,l,r,v);
else if(l>=T[rson].lef)Update(rson,l,r,v);
else {
Update(lson,l,T[lson].rig,v);
Update(rson,T[rson].lef,r,v);
}
T[u].sum=T[lson].sum+T[rson].sum;
}
}
int main(){
int N,Q,t;
int x,y,z;
int cas=0;
scanf("%d",&t);
while(t--){
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 ",++cas);
printf("%d.\n",T[1].sum);
}
return 0;
}