社区讨论

灵异事件!!!!

P2894[USACO08FEB] Hotel G参与者 2已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mhjogfry
此快照首次捕获于
2025/11/04 05:54
4 个月前
此快照最后确认于
2025/11/04 05:54
4 个月前
查看原帖
神犇们求解惑(太玄学了):提交记录
各位神犇应该可以看到我的提交记录其中前几份(19:34往前)代码都是一样的。但是分数大有不同每次都有 1~2 个点 RE,且 RE 的测试点会变,甚至还有 CE 的。。。。(就很难绷)
以下是我的代码(望解惑 感谢感谢):
CPP
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N = 5e4 + 10;

struct node {
    ll l, r, lzy = 0, sum, ls, rs, len;
} t[N << 2];

ll n, m, op, x, y;

void push_up(ll p) {
    t[p].sum = max({t[p << 1].sum, t[p << 1 | 1].sum, t[p << 1].rs + t[p << 1 | 1].ls});
    if (t[p << 1].sum == t[p << 1].len)
        t[p].ls = t[p << 1].sum + t[p << 1 | 1].ls;
    else
        t[p].ls = t[p << 1].ls;
    if (t[p << 1 | 1].sum == t[p << 1 | 1].len)
        t[p].rs = t[p << 1 | 1].sum + t[p << 1].rs;
    else
        t[p].rs = t[p << 1 | 1].rs;
}

void push_down(ll p) {
    if (t[p].lzy) {
        if (t[p].lzy == 1) {
            t[p << 1].sum = t[p << 1].ls = t[p << 1].rs = 0;
            t[p << 1 | 1].sum = t[p << 1 | 1].ls = t[p << 1 | 1].rs = 0;
            t[p << 1].lzy = t[p << 1 | 1].lzy = 1;
        } else if (t[p].lzy == 2) {
            t[p << 1].sum = t[p << 1].ls = t[p << 1].rs = t[p << 1].len;
            t[p << 1 | 1].sum = t[p << 1 | 1].ls = t[p << 1 | 1].rs = t[p << 1 | 1].len;
            t[p << 1].lzy = t[p << 1 | 1].lzy = 2;
        }
        t[p].lzy = 0;
    }
}

void build(ll p, ll l, ll r) {
    t[p].l = l, t[p].r = r, t[p].len = r - l + 1;
    t[p].sum = t[p].ls = t[p].rs = t[p].len;
    if (l == r) return;
    ll mid = (l + r) >> 1;
    build(p << 1, l, mid);
    build(p << 1 | 1, mid + 1, r);
}

void upd(ll p, ll l, ll r, ll k) {
    if (l == t[p].l && r == t[p].r) {
        t[p].lzy = k;
        if (k == 1) t[p].sum = t[p].ls = t[p].rs = 0;
        else t[p].sum = t[p].ls = t[p].rs = t[p].len;
        return;
    }
    push_down(p);
    ll mid = (t[p].l + t[p].r) >> 1;
    if (r <= mid) upd(p << 1, l, r, k);
    else if (l > mid) upd(p << 1 | 1, l, r, k);
    else {
        upd(p << 1, l, mid, k);
        upd(p << 1 | 1, mid + 1, r, k);
    }
    push_up(p);
}

ll qry(ll p, ll len) {
    if (t[p].sum < len) return 0;
    push_down(p);
    if (t[p << 1].sum >= len) return qry(p << 1, len);
    if (t[p << 1].rs + t[p << 1 | 1].ls >= len) 
        return (t[p].l + t[p].r) / 2 - t[p << 1].rs + 1;
    return qry(p << 1 | 1, len);
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n >> m;
    build(1, 1, n);
    while (m--) {
        cin >> op >> x;
        if (op == 1) {
            if (t[1].sum >= x) {
                ll res = qry(1, x);
                cout << res << '\n';
                upd(1, res, res + x - 1, 1);
            } else cout << "0\n";
        } else {
            cin >> y;
            upd(1, x, x + y - 1, 2);
        }
    }
    return 0;
}

回复

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

正在加载回复...