社区讨论
求调
学术版参与者 1已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @miel1hwb
- 此快照首次捕获于
- 2025/11/25 20:59 3 个月前
- 此快照最后确认于
- 2025/11/25 21:20 3 个月前
P4137 Rmq Problem / mex
CPP#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
struct node {
int l, r, id;
};
vector<node> q;
int n, m, a[N], ans[N];
int cnt[N], res, temp;
inline void add(int x) {
++cnt[a[x]];
while (cnt[res]) ++res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> m;
for (int i = 1; i <= n; ++i) cin >> a[i];
for (int i = 1; i <= m; ++i) {
int l, r;
cin >> l >> r;
q.push_back({l, r, i});
}
int b = max(pow(n, 0.5L), 1.0L);
sort(q.begin(), q.end(), [&](auto x, auto y) {
if (x.l / b != y.l / b) return x.l < y.l;
return x.r < y.r;
});
for (int i = 0; i < m; ) {
for (int j = 0; j <= 2e5; ++j) cnt[j] = 0;
temp = 0;
res = 0;
int l = min((q[i].l / b + 1) * b, n), r = l - 1;
do {
if (q[i].l / b == q[i].r / b) {
int sum = 0;
for (int j = q[i].l; j <= q[i].r; ++j) ++cnt[a[j]];
while (cnt[sum]) ++sum;
ans[q[i].id] = sum;
for (int j = q[i].l; j <= q[i].r; ++j) --cnt[a[j]];
}
while (r < q[i].r) add(++r);
temp = res;
while (l > q[i].l) add(--l);
ans[q[i].id] = res;
res = temp;
while (l < min((q[i].l / b + 1) * b, n)) {
--cnt[a[l]];
++l;
}
++i;
} while (q[i].l / b == q[max(i - 1, 0)].l / b);
}
for (int i = 1; i <= m; ++i) cout << ans[i] << '\n';
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...