제출 #1244543

#제출 시각아이디문제언어결과실행 시간메모리
1244543fskaricaICC (CEOI16_icc)C++20
0 / 100
2 ms584 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 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 rek(vector <int> g, vector <int> g2, int o);

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

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

    rek(a, b, 2);
}

void rek(vector <int> g, vector <int> g2, int o) {
    if (g.size() == 1 && g2.size() == 1) {
        if (o == 1) nadiUnutarGrupe(g[0], g2[0]);
        else spoji(g[0], g2[0]);
        return;
    }

    vector <int> gpola, gpola2, g2pola, g2pola2;

    for (int i = 0; i < (int)g.size(); i++) {
        if (i < g.size() / 2) gpola.push_back(g[i]);
        else gpola2.push_back(g[i]);
    }

    for (int i = 0; i < (int)g2.size(); i++) {
        if (i < g2.size() / 2) g2pola.push_back(g2[i]);
        else g2pola2.push_back(g2[i]);
    }

    if (sendQuery(gpola, g2)) {
        if (sendQuery(gpola, g2pola)) rek(gpola, g2pola, o);
        else rek(gpola, g2pola2, o);
    }
    else {
        if (sendQuery(gpola2, g2pola)) rek(gpola2, g2pola, o);
        else rek(g2pola, g2pola2, o);
    }
}

void solve() {
    vector <int> g, g2;
    int bit = 0;
    while (true) {
        g.clear(), g2.clear();

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

        if (sendQuery(g, g2)) break;
        bit++;
    }

    rek(g, g2, 1);
}

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...