社区讨论
二分答案 60pts,求 hack
P4447[AHOI2018初中组] 分组参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mlit5br6
- 此快照首次捕获于
- 2026/02/12 09:56 上周
- 此快照最后确认于
- 2026/02/14 14:50 5 天前
已通过讨论区所有 hack。
CPPint n, a[N];
bool check(int x) {
multiset<int> st(a + 1, a + n + 1);
multiset<int> q1;
vector<int> q2;
while (!st.empty()) {
int v = *st.begin(), p = -1;
for (int i = v; i <= v + x - 1; i++) {
if (st.find(i) == st.end()) {p = i - 1; break;}
}
if (p != -1) {
for (int i = v; i <= p; i++) st.erase(st.find(i)), q2.emplace_back(i);
} else {
for (int i = v; i <= v + x - 1; i++) st.erase(st.find(i));
q1.emplace(v + x - 1);
}
}
sort(q2.begin(), q2.end());
for (int i : q2) {
auto it = q1.find(i - 1);
if (it == q1.end()) return false;
q1.erase(it), q1.emplace(i);
}
return true;
}
void _main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
int l = 1, r = n, res = -1;
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) l = mid + 1, res = mid;
else r = mid - 1;
} cout << res;
}
思路为先把组的人数调到
mid,剩下的最后再调整,WA 60pts。不能理解为什么是错的,求可以手玩的 hack。
回复
共 2 条回复,欢迎继续交流。
正在加载回复...