# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1174158 | nguyenkhangninh99 | 사육제 (CEOI14_carnival) | C++17 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
#define int long long
/*
struct Seg {
int l, r, id;
bool operator<(const Seg &s) const {
return r > s.r;
}
};
int n;
vector<int> a, d;
vector<vector<Seg>> fiseg;
bool ok(int x) {
vector<int> b = a;
priority_queue<Seg> pq;
for (int i = 1; i <= n; ++i) {
for (auto &seg : segment[i]) pq.push(seg);
int cur = 0;
while (!pq.empty() && cur < x) {
if (pq.empty()) break;
Seg seg = pq.top();
if (seg.r < i) return false;
int transfer = min(x - cur, b[seg.id]);
cur += transfer;
b[seg.id] -= transfer;
if (!b[seg.id]) pq.pop();
}
}
return pq.empty();
}
*/
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
/* cin >> n;
a.assign(n + 1, 0);
d.assign(n + 1, 0);
fiseg.resize(n + 1);
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> d[i];
for (int i = 1; i <= n; ++i) {
int l = max(1LL, i - d[i]);
int r = min(n, i + d[i]);
if (a[i]) segment[l].push_back({l, r, i});
}
int l = 0, r = 1e18, res = -1;
while (l <= r) {
int mid = (l + r) / 2;
if(ok(mid)){
res = mid;
r = mid - 1;
} else l = mid + 1;
}
cout << res;
*/
int n; cin >> n;
vector<vector<int>> a;
a.push_back({1});
for(int i = 2; i <= n; i++){
int l = 0, r = int(a.size()) - 1, res = -1;
while(l <= r){
int mid = (l + r) / 2;
cout << mid + 2 << " " << i << " ";
for(int j = 0; j <= mid; j++) cout << a[j][0] << " ";
cout << endl;
int x; cin >> x;
if(x == mid + 2) l = mid + 1;
else{
res = mid;
r = mid - 1;
}
}
if(res == -1) a.push_back({i});
else a[res].push_back(i);
}
vector<int> res(n + 1);
int id = 1;
for(auto v: a){
for(int j: v) res[j] = id;
id++;
}
cout << "0 ";
for(int i = 1; i <= n; i++) cout << res[i] << " ";
}