标签:
http://acm.hdu.edu.cn/showproblem.php?pid=1698
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 #define N 1000010 7 #define lson L,m,rt<<1 8 #define rson m+1,R,rt<<1|1 9 int sum[N<<2],add[N<<2]; 10 struct node 11 { 12 int l,r; 13 int value; 14 }tree[N<<2]; 15 /* 16 Update 区间更新 17 Query 直接求根节点的sum 18 使用Lazy标记 19 Lazy标记的学习:http://blog.sina.com.cn/s/blog_a2dce6b30101l8bi.html 20 */ 21 void PushUp(int rt) 22 { 23 //自底向上更新 24 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 25 } 26 27 void BuildTree(int L,int R,int rt) 28 { 29 add[rt]=0; 30 if(L==R){ 31 sum[rt]=1; 32 return ; 33 } 34 int m=(L+R)>>1; 35 BuildTree(lson); 36 BuildTree(rson); 37 PushUp(rt); 38 } 39 40 void PushDown(int rt,int m) 41 { 42 //处理lazy标记,自顶向下更新 43 if(add[rt]){ 44 add[rt<<1]=add[rt]; 45 add[rt<<1|1]=add[rt]; 46 sum[rt<<1]=add[rt]*(m-(m>>1)); 47 sum[rt<<1|1]=add[rt]*(m>>1); 48 add[rt]=0; 49 } 50 } 51 52 void Update(int l,int r,int c,int L,int R,int rt) 53 { 54 if(add[rt]==c) return ; 55 if(L>=l&&R<=r){ 56 add[rt]=c; 57 sum[rt]=c*(R-L+1); 58 return ; 59 } 60 PushDown(rt,R-L+1); 61 int m=(R+L)>>1; 62 if(l<=m) Update(l,r,c,lson); 63 if(r>m) Update(l,r,c,rson); 64 PushUp(rt); 65 } 66 67 int main() 68 { 69 int cas=0; 70 int t; 71 scanf("%d",&t); 72 while(t--){ 73 int n,q; 74 scanf("%d%d",&n,&q); 75 BuildTree(1,n,1); 76 while(q--){ 77 int a,b,c; 78 scanf("%d%d%d",&a,&b,&c); 79 Update(a,b,c,1,n,1); 80 } 81 printf("Case %d: The total value of the hook is %d.\n",++cas,sum[1]); 82 } 83 return 0; 84 }
标签:
原文地址:http://www.cnblogs.com/fightfordream/p/5656739.html