Submission #1309494

#TimeUsernameProblemLanguageResultExecution timeMemory
1309494SulACarnival (CEOI14_carnival)C++20
100 / 100
7 ms508 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#define popcount __builtin_popcountll
#define all(a) (a).begin(), (a).end()
using namespace __gnu_pbds;
using namespace std;
using ordered_set = tree<int, null_type, less_equal<>, rb_tree_tag, tree_order_statistics_node_update>;

int dist[150][150];

int query(int l, int r) {
    if (dist[l][r] > 0) return dist[l][r];
    cout << r-l+1 << endl;
    for (int i = l; i <= r; i++) cout << 1+i << " ";
    cout << endl;
    cin >> dist[l][r];
    return dist[l][r];
}

int main() {
    cin.tie(nullptr)->ios::sync_with_stdio(false);

    int n; cin >> n;
    int a[n];

    auto check = [&](int l, int i) {
        if (l == i) return false;
        // Does i equal anything from [l, i-1]?
        return query(l, i-1) == query(l, i);
    };
    int unfound = 1;
    a[0] = unfound++;
    for (int i = 1; i < n; i++) {
        if (!check(0, i)) {
            a[i] = unfound++;
            continue;
        }
        int lo = 0, hi = i;
        while (hi-lo > 1) {
            int mid = (lo+hi)/2;
            if (check(mid, i))
                lo = mid;
            else
                hi = mid;
        }
        a[i] = a[lo];
    }
    // 1 2 1 3 2
    cout << "0\n";
    for (int x : a) cout << x << " ";
}
#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...