社区讨论
珂朵莉树求条
P2572[SCOI2010] 序列操作参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mkia2ml6
- 此快照首次捕获于
- 2026/01/17 20:22 2 个月前
- 此快照最后确认于
- 2026/01/20 16:05 2 个月前
仅 AC #1 #2 #3,其余 TLE。
CPP#include <bits/stdc++.h>
#define int long long
#define IT set <node> :: iterator
using namespace std;
struct node {
int l, r;
mutable bool v;
node(int l = 0, int r = -1, bool v = 0) : l(l), r(r), v(v) {}
bool operator < (const node &a) const {
return l < a.l;
}
};
set <node> st;
IT split(int x) {
IT it = st.lower_bound(node(x, -1, -1));
if(it != st.end() && it -> l == x) return it;
it--;
int l = it -> l, r = it -> r;
bool v = it -> v;
st.erase(it);
st.insert(node(l, x - 1, v));
return st.insert(node(x, r, v)).first;
}
void assign(int l, int r, int v) {
IT itr = split(r + 1), itl = split(l);
st.erase(itl, itr);
st.insert(node(l, r, v));
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int n, q;
cin >> n >> q;
st.insert(node(n + 1, n + 1, 0));
for(int i = 1; i <= n; i++) {
int x;
cin >> x;
st.insert(node(i, i, x));
}
while(q--) {
int op, l, r;
cin >> op >> l >> r;
l++, r++;
if(op == 0 || op == 1) {
assign(l, r, op);
} else if(op == 2) {
IT itr = split(r + 1), itl = split(l);
for(IT it = itl; it != itr; it++) it -> v ^= 1;
} else if(op == 3) {
int ans = 0;
IT itr = split(r + 1), itl = split(l);
for(IT it = itl; it != itr; it++) {
ans += (it -> r - it -> l + 1) * it -> v;
}
cout << ans << "\n";
} else {
int cnt = 0, maxn = 0;
IT itr = split(r + 1), itl = split(l);
for(IT it = itl; it != itr; it++) {
if(it -> v) cnt += it -> r - it -> l + 1;
else {
maxn = max(maxn, cnt);
cnt = 0;
}
}
cout << max(cnt, maxn) << "\n";
}
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...