社区讨论

珂朵莉树求条

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 条回复,欢迎继续交流。

正在加载回复...