线段树的区间修改
#include <stdio.h>
#define maxn 100100
int set[4*maxn],sum[4*maxn];
void push(int o,int m)
{
if(set[o])
{
set[2*o]=set[2*o+1]=set[o];
sum[2*o]=(m-(m/2))*set[o];
sum[2*o+1]=(m/2)*set[o];
set[o]=0;
}
}
void build(int l,int r,int o)
{
int m=(l+r)/2;
set[o]=0;
sum[o]=1;
if(l==r) return ;
build(l,m,2*o);
build(m+1,r,2*o+1);
sum[o]=sum[2*o]+sum[2*o+1];
}
void update(int ql,int qr,int c,int l,int r,int o)
{
if(ql<=l&&r<=qr)
{
set[o]=c;
sum[o]=c*(r-l+1);
return ;
}
push(o,r-l+1);
int m=(l+r)/2;
if(ql<=m) update(ql,qr,c,l,m,2*o);
if(qr>m) update(ql,qr,c,m+1,r,2*o+1);
sum[o]=sum[2*o]+sum[2*o+1];
}
int main()
{
int cas,i,j;
int n,m;
scanf("%d",&cas);
for(j=1;j<=cas;j++)
{
scanf("%d%d",&n,&m);
build(1,n,1);
for(i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
update(a,b,c,1,n,1);
}
printf("Case %d: The total value of the hook is %d.\n",j,sum[1]);
}
return 0;
}