제출 #1180798

#제출 시각아이디문제언어결과실행 시간메모리
1180798kilikuma사육제 (CEOI14_carnival)C++20
52 / 100
10 ms424 KiB
#include <bits/stdc++.h>
using namespace std;

int N, P[151];

int F(int u) {
    while (P[u] != u) P[u] = P[P[u]], u = P[u];
    return u;
}

void U(int u, int v) {
    int a = F(u), b = F(v);
    if (a != b) P[b] = a;
}

void find_same_color(int x, vector<int>& groups) {
    int l = 0, r = groups.size() - 1;
    while (l <= r) {
        int m = (l + r) / 2;
        cout << "2 " << groups[m] << ' ' << x << endl;
        int R; cin >> R;
        if (R == 1) {
            U(groups[m], x);
            return;
        } else {
            l = m + 1;
        }
    }
}

void D(vector<int> f) {
    if (f.size() == 1) return;
    int m = f.size() / 2;
    vector<int> l(f.begin(), f.begin() + m), r(f.begin() + m, f.end());
    D(l), D(r);
    
    map<int, vector<int>> group_map;
    for (int x : l) group_map[F(x)].push_back(x);
    
    for (int x : r) {
        if (group_map.empty()) break;
        cout << group_map.size() + 1 << ' ';
        for (auto& [k, v] : group_map) cout << v[0] << ' ';
        cout << x << endl;
        int R; cin >> R;
        if (R < group_map.size() + 1) {
            for (auto& [k, v] : group_map) {
                find_same_color(x, v);
                if (F(x) == k) break;
            }
        }
    }
}

int main() {
    cin >> N;
    for (int i = 1; i <= N; ++i) P[i] = i;
    vector<int> f(N); iota(f.begin(), f.end(), 1);
    D(f);
    map<int, int> m; int c = 0;
    cout << "0 ";
    for (int i = 1; i <= N; ++i) {
        int r = F(i);
        if (!m.count(r)) m[r] = ++c;
        cout << m[r] << ' ';
    }
    cout << endl;
    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...