제출 #1244689

#제출 시각아이디문제언어결과실행 시간메모리
1244689fskaricaICC (CEOI16_icc)C++20
90 / 100
87 ms640 KiB
#include <bits/stdc++.h>
#include "icc.h"

using namespace std;

#define ll long long
#define fi first
#define se second
#define pii pair<int, int>

const int MAX = 110;
int n;
int parent[MAX];
int depth[MAX];
vector <int> v[MAX];
vector <int> groups;
int cntQuery = 0;

int find(int a) {
    if (a == parent[a]) return a;
    return parent[a] = find(parent[a]);
}

void spoji(int a, int b) {
    setRoad(a, b);

    a = find(a);
    b = find(b);

    if (a == b) return;

    if (depth[a] >= depth[b]) {
        depth[a] += depth[b];
        parent[b] = a;
        for (auto e : v[b]) v[a].push_back(e);
    }
    else {
        depth[b] += depth[a];
        parent[a] = b;
        for (auto e : v[a]) v[b].push_back(e);
    }
}

int sendQuery(vector <int> a, vector <int> b) {
    if (a.empty()) return 0;
    if (b.empty()) return 0;

    int sza = a.size();
    int szb = b.size();

    int arra[sza];
    int arrb[szb];

    for (int i = 0; i < sza; i++) arra[i] = a[i];
    for (int i = 0; i < szb; i++) arrb[i] = b[i];

    return query(sza, szb, arra, arrb);
}

void bs(vector <int> a, vector <int> b) {
    if (a.size() == 1) {
        if (b.size() == 1) {
            spoji(a[0], b[0]);
        }
        else {
            bs(b, a);
        }

        return;
    }

    vector <int> v, v2;
    for (int i = 0; i < a.size() / 2; i++) v.push_back(a[i]);
    for (int i = a.size() / 2; i < a.size(); i++) v2.push_back(a[i]);

    if (sendQuery(v, b)) bs(v, b);
    else bs(v2, b);
}

void nadiUnutarGrupe(vector <int> a, vector <int> b) {
    bs(a, b);
}

void solve() {
    vector <int> g, g2;
    vector <int> a, b;

    int bit = 0;
    while (true) {
        g.clear(), g2.clear();
        for (int i = 0; i < (int)groups.size(); i++) {
            if (i & (1 << bit)) g2.push_back(groups[i]);
            else g.push_back(groups[i]);
        }

        a.clear(), b.clear();
        for (int i = 1; i <= n; i++) {
            for (auto e : g)  if (find(i) == e) a.push_back(i);
            for (auto e : g2) if (find(i) == e) b.push_back(i);
        }

        if (sendQuery(a, b)) break;
        bit++;

        if (bit > 20) {
            cout << "penis\n";
            return;
        }
    }

    nadiUnutarGrupe(a, b);
}

void run(int N) {
    n = N;

    for (int i = 1; i <= n; i++) {
        parent[i] = i;
        depth[i] = 1;
        v[i].push_back(i);
    }

    for (int i = 1; i < n; i++) {
        groups.clear();
        for (int j = 1; j <= n; j++) if (find(j) == j) groups.push_back(j);

        solve();
    }
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...