标签:
Input
Output
Sample Input
Sample Output
1 #include"iostream" 2 #include"algorithm" 3 #include"cstdio" 4 #include"cstring" 5 #include"cmath" 6 #define max(a,b) a>b?a:b 7 #define min(a,b) a<b?a:b 8 #define MX 100000+10000 9 #define INF 0x3f3f3f3f 10 #define lson l,m,rt<<1 11 #define rson m+1,r,rt<<1|1 12 using namespace std; 13 int sum[MX<<2],lazy[MX<<2]; 14 int ll,n,a,b,val; 15 void PushUp(int rt) { 16 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 17 } 18 19 //这题的关键就在这个lazy数组的下沉,看了几遍别人的解题报告才写出来 。 20 void PushDown(int rt,int m) { 21 if(lazy[rt]!=INF) { 22 lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt]; //lazy标记下移 23 sum[rt<<1]= (m-(m>>1))*lazy[rt]; //对半下分 24 sum[rt<<1|1]=(m>>1)*lazy[rt]; 25 lazy[rt]=INF; //标记lazy为空 26 } 27 } 28 29 void Build(int l,int r,int rt) { 30 lazy[rt]=INF; //懒惰标记 31 sum[rt]=1; //每个节点标记为1; 32 if(r==l) { 33 return; 34 } 35 int m=(r+l)>>1; 36 Build(lson); 37 Build(rson); 38 PushUp(rt); 39 } 40 41 void UpData(int L,int R,int val,int l,int r,int rt) { 42 if(r<=R&&L<=l) { 43 lazy[rt]=val; //给lazy数组赋值 44 sum[rt]=val*(r-l+1);//因为数值是直接覆盖,所以直接用lazy的值乘以长度就是这个节点的值 45 return ; 46 } 47 PushDown(rt,r-l+1); 48 int m=(r+l)>>1; 49 if(L<=m)UpData(L,R,val,lson); 50 if(R>m) UpData(L,R,val,rson); 51 PushUp(rt); 52 } 53 54 int main() { 55 int T; 56 while(~scanf("%d",&T)) 57 for(int qq=1; qq<=T; qq++) { 58 scanf("%d%d",&ll,&n); 59 Build(1,ll,1); 60 for(int i=1; i<=n; i++) { 61 scanf("%d%d%d",&a,&b,&val); 62 UpData(a,b,val,1,ll,1); 63 } 64 printf("Case %d: The total value of the hook is %d.\n",qq,sum[1]); 65 } 66 return 0; 67 }
标签:
原文地址:http://www.cnblogs.com/HDMaxfun/p/5693717.html