一道线段树区间替换的模板题
练习一下notonlysuccess的线段树模板
注意注意!!! << >> 这两个运算符号的优先级非常低,只要写到就要加括号,调了两个小时的血泪啊
#include<stdio.h>
#include<string.h>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define MAX_N 500000
int col[MAX_N];
int sum[MAX_N];
void PushUp(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void PushDown(int rt,int m)
{
if(col[rt])
{
col[rt<<1] = col[rt<<1|1] = col[rt];
sum[rt<<1] = ( m - (m>>1) ) * col[rt];
sum[rt<<1|1] =( m>>1) * col[rt];
col[rt] = 0;
}
}
void update(int L,int R,int x,int l,int r,int rt)
{
if( L<=l && r<=R )
{
col[rt] = x;
sum[rt] = (r-l+1) * x;
return ;
}
PushDown( rt , r-l + 1 );
int m= ( l + r ) >> 1;
if(L<=m) update( L , R , x , lson );
if(R>m) update( L , R , x , rson );
PushUp(rt);
}
void build(int l,int r,int rt)
{
col[rt] = 0;
sum[rt] = 1;
if(l==r) return;
int m = (l+r)>>1;
build(lson);
build(rson);
PushUp(rt);
}
int main()
{
int cas;
scanf("%d",&cas);
for(int T = 1;T <= cas;T++)
{
memset(sum , 0 , sizeof(sum));
memset(col , 0 , sizeof(col));
int n;
scanf("%d",&n);
build(1 , n , 1);
int m;
scanf("%d",&m);
for(int 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" ,T,sum[1]);
}
return 0;
}