HDU 1698 线段树区间修改

来源:互联网 发布:免费源码发布站程序 编辑:程序博客网 时间:2024/06/14 20:32

一道线段树区间替换的模板题

练习一下notonlysuccess的线段树模板

注意注意!!! << >> 这两个运算符号的优先级非常低,只要写到就要加括号,调了两个小时的血泪啊

#include<stdio.h>#include<string.h>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define MAX_N 500000int 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;}


原创粉丝点击