首页 > 其他 > 详细

kb-07线段树-05-区间整体修改查询;(水)

时间:2015-05-30 23:59:52      阅读:477      评论:0      收藏:0      [点我收藏+]
 1 /*
 2   
 3 
 4  */
 5 #include<iostream>
 6 #include<cstring>
 7 #include<cstdio>
 8 using namespace std;
 9 struct P
10 {
11     int l,r,value;
12     int add;
13 }tr[400005];
14 void Pushup(int rt)
15 {
16     tr[rt].value=tr[rt<<1].value+tr[rt<<1|1].value;
17 }
18 void build(int rt,int l,int r)
19 {
20     tr[rt].l=l;
21     tr[rt].r=r;
22     tr[rt].add=0;
23     if(l==r)
24     {
25         tr[rt].value=1;
26         return ;
27     }
28     int mid=(l+r)/2;
29     build(rt<<1,l,mid);
30     build(rt<<1|1,mid+1,r);
31     Pushup(rt);
32 }
33 /*
34    区间修改,整体改成一个数,所以只需要记录这个数就可以了,区间的和可以用这个数乘以区间长度来求;
35  */
36 void Pushdown(int rt)
37 {
38     if(tr[rt].add<=0)
39         return ;
40     tr[rt<<1].value=tr[rt].add*(tr[rt<<1].r-tr[rt<<1].l+1);
41     tr[rt<<1|1].value=tr[rt].add*(tr[rt<<1|1].r-tr[rt<<1|1].l+1);
42     tr[rt<<1].add=tr[rt].add;
43     tr[rt<<1|1].add=tr[rt].add;
44     tr[rt].add=0;
45 }
46 void Update(int rt,int l,int r,int begin,int end,int x)
47 {
48     if(begin<=l&&end>=r)
49     {
50         tr[rt].add=x;
51         tr[rt].value=x*(r-l+1);//把区间更新成x
52         return ;
53     }
54     Pushdown(rt);
55     if(begin <=tr[rt<<1].r)
56     {
57         Update(rt<<1,l,tr[rt<<1].r,begin,end,x);
58     }
59     if(end >=tr[rt<<1|1].l)
60     {
61         Update(rt<<1|1,tr[rt<<1|1].l,r,begin,end,x);
62     }
63     Pushup(rt);//区间下面的值发生变化,所以要pushup
64 
65 }
66 int main()
67 {
68     int T,k=1;
69     scanf("%d",&T);
70     while(T--)
71     {
72         int n,q;
73         scanf("%d%d",&n,&q);
74         memset(tr,0,sizeof(tr));
75         build(1,1,n);
76         for(int i=0;i<q;i++)
77         {
78             int ll,rr,v;
79             scanf("%d%d%d",&ll,&rr,&v);
80             Update(1,1,n,ll,rr,v);
81 //            for(int j=1;j<=25;j++)
82 //                printf("%d:%d\n",j,tr[j].value);
83         }
84         int ans=tr[1].value;
85         printf("Case %d: The total value of the hook is %d.\n",k++,ans);
86     }
87     return 0;
88 }

 

kb-07线段树-05-区间整体修改查询;(水)

原文:http://www.cnblogs.com/by-1075324834/p/4541280.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!