线段树,区间设置值,区间查询。
需要注意的是标记pushdown的时候一定要把sum更新。
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 100000 + 10;
int t,n,sumv[N<<2],setv[N<<2],q,l,r,k,cas;
void pushdown(int rt,int len) {
if(setv[rt]){
setv[rt<<1] = setv[rt];
setv[rt<<1|1] = setv[rt];
sumv[rt<<1|1] = setv[rt]*(len>>1);
sumv[rt<<1] = setv[rt]*(len - (len>>1));
setv[rt] = 0;
}
}
void build(int rt,int L,int R){
if(L == R) {
sumv[rt] = 1;
setv[rt] = 0;
return ;
}
int mid = (R+L)/2;
build(rt<<1,L,mid);
build(rt<<1|1,mid+1,R);
setv[rt] = 0;
sumv[rt] = sumv[rt<<1] + sumv[rt<<1|1];
}
void update(int rt,int L, int R,int l,int r,int v){
if(l <= L && R <=r) {
setv[rt] = v;
sumv[rt] = (R-L+1) *v;
return ;
}
pushdown(rt,R-L+1);
int mid = (L+R)/2;
if(l<=mid) update(rt<<1,L,mid,l,r,v);
if(mid<r) update(rt<<1|1,mid+1,R,l,r,v);
sumv[rt] = sumv[rt<<1] + sumv[rt<<1|1];
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&q);
build(1,1,n);
for(int i = 0;i<q;i++){
scanf("%d%d%d",&l,&r,&k);
update(1,1,n,l,r,k);
}
printf("Case %d: The total value of the hook is %d.\n",++cas,sumv[1]);
}
return 0;
}