社区讨论

珂朵莉树求调,自己做N多数据

AT_abc380_e[ABC380E] 1D Bucket Tool参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m3u9eq60
此快照首次捕获于
2024/11/23 22:22
去年
此快照最后确认于
2024/11/24 09:43
去年
查看原帖
求调!样例过了,但提交12TLE,5个RE,竟然一个没过,郁闷
CPP
#include <bits/stdc++.h>

using namespace std;
#define it set<node> :: iterator
const int maxn = 5e5 + 5;

struct node{
    int l, r;
    mutable int val;

    node(int L, int R = 0, int V = 0) :
            l(L), r(R), val(V) {}
};

bool operator<(const node &a, const node &b) {
    return a.l < b.l;
}

set<node> s;
int cnt[maxn];

it split(int pos, int a) {
    it u = s.lower_bound(node(pos));
    int v = u->val;
    it x = u;
    --x;
    int l = u->l, r = u->r;
    // 往左边暴力扩展
    while (1) {
        if (x->val == v) {
            l = x->l;
        } else {
            break;
        }
        cnt[v] -= x->r - x->l + 1;

        it t = x;
        if (t == s.begin()) {
            s.erase(t);
            break;
        }

        --x;
        s.erase(t);
    }
    x = u;
    ++x;
    while (x != s.end()) {
        if (x->val == v) {
            r = x->r;
        } else {
            break;
        }
        cnt[v] -= x->r - x->l + 1;
        it t = x;
        ++x;
        s.erase(t);
    }
    cnt[v] -= u->r - u->l + 1;
    s.erase(u);
    cnt[a] += r - l + 1;
    s.insert(node{l, r, a});
}

void best() {
    int n, q;
    cin >> n >> q;
    for (int i = 1; i <= n; ++i) {
        s.insert(node{i, i, i});
        ++cnt[i];
    }
    while(q--) {
        int opt;
        cin >> opt;
        if (opt == 1) {
            int x, c;
            cin >> x >> c;
            split(x, c);
        } else {
            int x;
            cin >> x;
            cout << cnt[x] << '\n';
        }
    }
}

int main() {
    // 提升cin、cout效率
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    best();

    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...