社区讨论
灵异事件!!!!
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 条回复,欢迎继续交流。
正在加载回复...