和poj3498差不多,lazy思想
#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=100000;
int sum[maxn<<2],f[maxn<<2],N,Q;
void pushUp(int rt){
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void pushDown(int rt,int m){
if(f[rt]){
f[rt<<1]=f[rt<<1|1]=f[rt];
sum[rt<<1]=f[rt]*(m-(m>>1));
sum[rt<<1|1]=f[rt]*(m>>1);
f[rt]=0;
}
}
void build(int l,int r,int rt){
sum[rt]=1;
f[rt]=0;
if(l==r)return;
int m=(l+r)>>1;
build(lson),build(rson);
pushUp(rt);
}
void update(int L,int R,int v,int l,int r,int rt){
if(L<=l&&r<=R){
f[rt]=v;
sum[rt]=v*(r-l+1);
return;
}
pushDown(rt,r-l+1);
int m=(l+r)>>1;
if(L<=m)update(L,R,v,lson);
if(R>m)update(L,R,v,rson);
pushUp(rt);
}
int query(int l,int r,int rt){
if(l==r)return sum[rt];
pushDown(rt,r-l+1);
int m=(l+r)>>1,ret=0;
ret+=query(lson);
ret+=query(rson);
return ret;
}
int main(){
int t,cas=1;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&N,&Q);
build(1,N,1);
for (int i=0;i<Q;++i)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a>b)swap(a,b);
update(a,b,c,1,N,1);
}
printf("Case %d: The total value of the hook is %d.\n",cas++,query(1,N,1));
}
return 0;
}