标签:
1 #include<cstdio> 2 using namespace std; 3 4 const int maxn=100050; 5 int sum[maxn<<2]; 6 int add[maxn<<2]; 7 8 struct node 9 { 10 int l,r; 11 }tree[maxn<<2]; 12 13 void PushUp(int rt) 14 { 15 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 16 } 17 18 void PushDown(int rt,int m) 19 { 20 if(add[rt]) 21 { 22 add[rt<<1]=add[rt]; 23 add[rt<<1|1]=add[rt]; 24 sum[rt<<1]=add[rt]*(m-(m>>1)); 25 sum[rt<<1|1]=add[rt]*(m>>1); 26 add[rt]=0; 27 } 28 } 29 30 31 void build(int l,int r,int rt) 32 { 33 tree[rt].l=l; 34 tree[rt].r=r; 35 add[rt]=0; 36 if(l==r) 37 { 38 sum[rt]=1; 39 return; 40 } 41 int mid=(r+l)>>1; 42 build(l,mid,rt<<1); 43 build(mid+1,r,rt<<1|1); 44 PushUp(rt); 45 } 46 47 void update(int t,int l,int r,int rt) 48 { 49 if(tree[rt].l==l&&tree[rt].r==r) 50 { 51 add[rt]=t; 52 sum[rt]=t*(r-l+1); 53 return; 54 } 55 if(tree[rt].l==tree[rt].r)return; 56 PushDown(rt,tree[rt].r-tree[rt].l+1); 57 int mid=(tree[rt].r+tree[rt].l)>>1; 58 if(r<=mid)update(t,l,r,rt<<1); 59 else if(l>mid)update(t,l,r,rt<<1|1); 60 else 61 { 62 update(t,l,mid,rt<<1); 63 update(t,mid+1,r,rt<<1|1); 64 } 65 PushUp(rt); 66 } 67 68 int query(int l,int r,int rt) 69 { 70 if(l==tree[rt].l&&r==tree[rt].r) 71 { 72 return sum[rt]; 73 } 74 PushDown(rt,tree[rt].r-tree[rt].l+1); 75 int mid=(tree[rt].l+tree[rt].r)>>1; 76 int ans=0; 77 if(r<=mid)ans+=query(l,r,rt<<1); 78 else if(l>mid)ans+=query(l,r,rt<<1|1); 79 else 80 { 81 ans+=query(l,mid,rt<<1); 82 ans+=query(mid+1,r,rt<<1|1); 83 } 84 return ans; 85 } 86 87 int main() 88 { 89 //freopen("in.txt","r",stdin); 90 int i,t,a,b,val,n,m; 91 scanf("%d",&t); 92 for(i=1;i<=t;i++) 93 { 94 scanf("%d",&n); 95 build(1,n,1); 96 scanf("%d",&m); 97 while(m--) 98 { 99 scanf("%d%d%d",&a,&b,&val); 100 update(val,a,b,1); 101 } 102 int ans=query(1,n,1); 103 printf("Case %d: The total value of the hook is %d.\n",i,ans); 104 } 105 return 0; 106 }
HDU 1698 Just a Hook(线段树lazy成段更新)
标签:
原文地址:http://www.cnblogs.com/homura/p/4709009.html