Submission #1144267

#TimeUsernameProblemLanguageResultExecution timeMemory
1144267ind1vCarnival (CEOI14_carnival)C++17
100 / 100
4 ms436 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 155;

struct fenwick_tree {
  int f[N];
  
  fenwick_tree() {
    memset(f, 0, sizeof(f));
  }
  
  void upd(int i, int x) {
    for (; i < N; i += i & -i) {
      f[i] += x;
    }
  }
  
  int get(int i) {
    int r = 0;
    for (; i > 0; i -= i & -i) {
      r += f[i];
    }
    return r;
  }
  
  int get(int l, int r) {
    return get(r) - get(l - 1);
  }
};

struct dsu {
  int lab[N];
  
  dsu() {
    memset(lab, -1, sizeof(lab));
  }
  
  int find(int u) {
    return lab[u] < 0 ? u : lab[u] = find(lab[u]);
  }
  
  bool merge(int u, int v) {
    if ((u = find(u)) == (v = find(v))) {
      return false;
    }
    if (lab[u] > lab[v]) {
      swap(u, v);
    }
    lab[u] += lab[v];
    lab[v] = u;
    return true;
  }
};

int n;
int c[N];
fenwick_tree ft;
dsu g;

int ask(int l, int r) {
  cout << r - l + 1 << ' ';
  for (int i = l; i <= r; i++) {
    cout << i << ' ';
  }
  cout << endl;
  int res;
  cin >> res;
  return res;
}

void answer() {
  cout << 0 << ' ';
  for (int i = 1; i <= n; i++) {
    cout << c[i] << ' ';
  }
  cout << endl;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n;
  int prv = 0;
  for (int i = 1; i <= n; i++) {
    int res = ask(1, i);
    ft.upd(i, 1);
    if (res == prv + 1) {
      prv = res;
      continue;
    } else {
      prv = res;
      int lo = 1, hi = i, ans = -1;
      while (lo <= hi) {
        int mid = (lo + hi) >> 1;
        if (ft.get(mid, i) == ask(mid, i)) {
          ans = mid;
          hi = mid - 1;
        } else {
          lo = mid + 1;
        }
      }
      ans--;
      ft.upd(ans, -1);
      g.merge(ans, i);
    }
  }
  vector<int> v;
  for (int i = 1; i <= n; i++) {
    c[i] = g.find(i);
    v.emplace_back(c[i]);
  }
  sort(v.begin(), v.end());
  v.erase(unique(v.begin(), v.end()), v.end());
  for (int i = 1; i <= n; i++) {
    c[i] = lower_bound(v.begin(), v.end(), c[i]) - v.begin() + 1;
  }
  answer();
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...