题目
题目原文请移步下面的链接
- https://www.luogu.com.cn/problem/P2846
- 参考题解:https://www.luogu.com.cn/problem/solution/P2846
- 标签:
OI
、USACO
、数据结构
、模拟
、树状数组
、线段树
题解
思路
- 第一:这道题暴力模拟可以过,用树状数组实现更简单;
- 第二:这道题最初的思路没什么问题,可程序调试耗费了大量时间,一道虐心的题;
- 第三:我终于还是AC了,更详细的题解就不发了,洛古上写的很详细。
代码
#include <bits/stdc++.h>
using namespace std;
#define endl '\n';
typedef long long LL;
struct edge {
int l, r;
LL sum, add;
};
struct Segment_Tree {
vector<edge> t;
Segment_Tree(int n) : t(4 * n){}
void push_up(int u) {
t[u].sum = t[u << 1].sum + t[u << 1 | 1].sum;
}
void push_down(int u) {
auto &root = t[u], &left = t[u << 1], &right = t[u << 1 | 1];
int mid = root.l + root.r >> 1;
if (root.add) {
left.add ^= 1;
left.sum = left.r - left.l + 1 - left.sum;
right.add ^= 1;
right.sum = right.r - right.l + 1 - right.sum;
root.add = 0;
}
}
void build(int u, int l, int r) {
t[u].l = l;
t[u].r = r;
if (l == r) {
return;
}
int mid = l + r >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
push_up(u);
}
LL query(int u, int l, int r) {
if (t[u].l >= l && t[u].r <= r) {
return t[u].sum;
}
push_down(u);
int mid = t[u].l + t[u].r >> 1;
LL s = 0;
if (l <= mid) {
s = query(u << 1, l, r);
}
if (r > mid) {
s += query(u << 1 | 1, l, r);
}
return s;
}
void modify(int u, int x, LL v) {
if (t[u].l == x && t[u].r == x) {
t[u].sum = v;
} else {
int mid = (t[u].l + t[u].r) >> 1;
if (x <= mid) {
modify(u << 1, x, v);
} else {
modify(u << 1 | 1, x, v);
}
push_up(u);
}
}
void cnt(int u, int l, int r) {
if (t[u].l >= l && t[u].r <= r) {
t[u].add ^= 1;
t[u].sum = t[u].r - t[u].l + 1 - t[u].sum;
} else {
push_down(u);
int mid = t[u].l + t[u].r >> 1;
if (l <= mid) {
cnt(u << 1, l, r);
}
if (r > mid) {
cnt(u << 1 | 1, l, r);
}
push_up(u);
}
}
};
void best_coder() {
int n, m;
cin >> n >> m;
Segment_Tree st(n);
st.build(1, 1, n);
int q, x, y;
for (int i = 0; i < m; ++i) {
cin >> q >> x >> y;
if (q == 0) {
st.cnt(1,x, y);
} else {
cout << st.query(1, x, y) << endl;
}
}
}
void happy_coder() {
}
int main() {
// 提升cin、cout效率
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
// 小码匠
best_coder();
// 最优解
// happy_coder();
// 返回
return 0;
}
小码匠上初中后,平时作业比较多,课余时间都奉献给一方键盘和数学公式。
有时间我会把文章发布到优快云,和更多的小伙伴分享我的学习心路。