线段树 延迟更新

fafu 1008

 1 #include<stdio.h>
 2 #include<string.h>
 3 const int N=100000+5;
 4 int n, q;
 5 int a[N], tree[N<<2], t[N<<2];
 6 
 7 void build(int rt, int l, int r)
 8 {
 9     if(l==r)
10         tree[rt]=10;
11     else
12     {
13         int m=(l+r)>>1;
14         build(rt<<1, l, m);
15         build((rt<<1)+1, m+1, r);
16         
17         tree[rt]=tree[rt<<1]+tree[(rt<<1)+1];
18     }
19 }
20 
21 void pushDown(int rt, int m)
22 {
23     if(t[rt]!=-1)
24     {
25         t[rt<<1]=t[rt];
26         t[(rt<<1)+1]=t[rt];
27         tree[rt<<1]=t[rt]*(m-(m>>1));
28         tree[(rt<<1)+1]=t[rt]*(m>>1);
29         t[rt]=-1;
30     }
31 }
32 
33 void update(int rt, int l, int r, int x, int y, int v)
34 {
35     if(x<=l && r<=y)
36     {
37         t[rt]=v;
38         tree[rt]=(r-l+1)*v;
39         return;
40     }
41     pushDown(rt, r-l+1);
42     int m=(l+r)>>1;
43     if(x<=m)
44         update(rt<<1, l, m, x, y, v);
45     if(m<y)
46         update((rt<<1)+1, m+1, r, x, y, v);
47     tree[rt]=tree[rt<<1]+tree[(rt<<1)+1];
48 }
49 
50 int main()
51 {
52     int T;
53     scanf("%d", &T);
54     for(int k=1; k<=T; k++)
55     {
56         scanf("%d%d", &n, &q);
57         int x, y, v;
58         build(1, 1, n);
59         memset(t, -1, sizeof(t));
60         for(int i=0; i<q; i++)
61         {
62             scanf("%d%d%d", &x, &y, &v);
63             int mi=x<y?x:y;
64             int ma=x>y?x:y;
65             update(1, 1, n, mi, ma, v);
66         }
67         printf("Case %d: The total value of the stick is %d.\n", k, tree[1]);
68     }
69     return 0;
70 }

 

转载于:https://www.cnblogs.com/qyy-goodluck/p/4353178.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值