题解 P3870 【[TJOI2009]开关】

又是一道线段树。。。

本题其实是一道裸题。。。不明白为什么是这个难度标签。

思路很明显,用tree[i].val表示区间内开着的灯的数量。

然后常规操作(建树、查询、修改)就可以了。

最后:lazy tag是个好东西。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #define lson pos << 1
 5 #define rson pos << 1 | 1
 6 using namespace std;
 7 
 8 const int maxn = 100100;
 9 
10 int n, m, c, a, b;
11 
12 struct node {
13     int l,r;
14     int val;          
15     int lazy;
16 } tree[maxn << 2];
17 
18 inline void Pushup(int pos) {
19     tree[pos].val = tree[lson].val + tree[rson].val;
20 }
21 
22 void Pushdown(int pos) {
23     if(tree[pos].lazy) {
24         tree[lson].lazy ^= 1; 
25         tree[rson].lazy ^= 1;
26         tree[lson].val = tree[lson].len() - tree[lson].val;
27         tree[rson].val = tree[rson].len() - tree[rson].val;
28         tree[pos].lazy = 0;
29     }
30 }
31 
32 void Build(int l, int r, int pos) {  
33     tree[pos].l = l;
34     tree[pos].r = r;
35     tree[pos].val = 0;
36     if(l == r) return ;
37     int mid = (l + r) >> 1;
38     Build(l, mid, lson);
39     Build(mid + 1, r, rson);
40 }
41 
42 void Update(int l, int r, int pos) {
43     if(l <= tree[pos].l && tree[pos].r <= r) {
44         tree[pos].val = tree[pos].len() - tree[pos].val;
45         tree[pos].lazy ^= 1;
46         return ;
47     }
48     Pushdown(pos);
49     int mid = tree[pos].mid();
50     if(l <= mid) Update(l, r, lson);
51     if(r > mid) Update(l, r, rson);
52     Pushup(pos);
53 }
54 
55 int Query(int l, int r, int pos) {
56     if(l <= tree[pos].l && tree[pos].r <= r) {
57         return tree[pos].val;
58     }
59     Pushdown(pos);
60     int mid = tree[pos].mid();
61     int ans = 0;
62     if(l <= mid)  ans += Query(l, r, lson);
63     if(r > mid)   ans += Query(l, r, rson);
64     return ans;
65 }
66 
67 int main() {
68     cin >> n >> m;
69     Build(1, n, 1);
70     while(m--) {
71         cin >> c >> a >> b;
72         if(c == 0) {
73             Update(a, b, 1);
74         } else {
75             cout << Query(a, b, 1) << endl;
76         }
77     }
78 }

 

话说回来。。。这道题好像在洛谷上有不知一道重题,可以n倍经验了!!

转载于:https://www.cnblogs.com/ilverene/p/9819026.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值