社区讨论
WA+RE 0分求助
P2824[HEOI2016/TJOI2016] 排序参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mj6kqncy
- 此快照首次捕获于
- 2025/12/15 11:08 2 个月前
- 此快照最后确认于
- 2025/12/15 15:00 2 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
struct Query {
int op, l, r;
};
vector<Query> qs;
const int N = 1e5 + 10, M = 4 * N;
int w[N];
int sum[M], tag[M], len[M];
int n;
int pos;
void pushup(int u) {
sum[u] = sum[u * 2] + sum[u * 2 + 1];
}
void update(int u, int v) {
tag[u] = v;
if (!v) sum[u] = 0;
else sum[u] = len[u];
}
void pushdown(int u) {
if (tag[u] != -1) {
update(u * 2, tag[u]), update(u * 2 + 1, tag[u]);
tag[u] = -1;
}
}
void build(int u, int l, int r, int x) {
len[u] = r - l + 1;
tag[u] = -1;
if (l == r) {
sum[u] = (w[l] >= x ? 1 : 0);
return;
}
int mid = (l + r) >> 1;
build(u * 2, l, mid, x), build(u * 2 + 1, mid + 1, r, x);
}
void modify(int u, int l, int r, int L, int R, int v) {
if (l >= L and r <= R) {
update(u, v);
return;
}
pushdown(u);
int mid = (l + r) >> 1;
if (L <= mid) modify(u * 2, l, mid, L, R, v);
if (R > mid) modify(u * 2 + 1, mid + 1, r, L, R, v);
pushup(u);
}
int query(int u, int l, int r, int L, int R) {
if (l >= L and r <= R) return sum[u];
pushdown(u);
int mid = (l + r) >> 1;
int ans = 0;
if (L <= mid) ans = query(u * 2, l, mid, L, R);
if (R > mid) ans += query(u * 2 + 1, mid + 1, r, L, R);
return ans;
}
bool check(int mid) {
build(1, 1, n, mid);
for (auto q : qs) {
int s = query(1, 1, n, q.l, q.r);
if (!q.op) {
modify(1, 1, n, q.l, q.r - s, 0);
modify(1, 1, n, q.r - s + 1, q.r, 1);
} else {
modify(1, 1, n, q.l, q.l + s - 1, 1);
modify(1, 1, n, q.l + s, q.r, 0);
}
}
return query(1, 1, n, pos, pos) == 1;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int m;
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> w[i];
for (int i = 1; i <= m; i++) {
int op, l, r;
cin >> op >> l >> r;
qs.push_back({op, l, r});
}
cin >> pos;
int l = 1, r = n, mid, ans;
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) {
l = mid + 1;
ans = mid;
} else r = mid - 1;
}
cout << ans << '\n';
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...