Submission #1306813

#TimeUsernameProblemLanguageResultExecution timeMemory
1306813SharkyChameleon's Love (JOI20_chameleon)C++20
100 / 100
48 ms556 KiB
#include "chameleon.h"
#include <bits/stdc++.h>
using namespace std;

namespace {

const int N = 1001;
bool vis[N], ans[N];
int c[N];
vector<int> adj[N], v[2];
bool ban[N][3];

}  // namespace



void dfs(int u) {
    vis[u] = true;
    v[c[u]].push_back(u);
    for (int v : adj[u]) if (!vis[v]) {
        c[v] = c[u] ^ 1;
        dfs(v);
    }
}

void helper(int a, int b) {
    if (ans[a] || ans[b]) return;
    ans[a] = ans[b] = true;
    Answer(a, b);
}

void Solve(int n) {
    for (int i = 2; i <= 2 * n; i++) {
        for (int j = 1; j <= i; j++) vis[j] = false;
        v[0].clear(); v[1].clear();
        for (int j = 1; j < i; j++) if (!vis[j]) dfs(j);
        for (int j = 0; j < 2; j++) {
            while (true) {
                vector<int> q = v[j];
                q.push_back(i);
                int res = Query(q);
                if (res < q.size()) {
                    int l = 0, r = v[j].size() - 1;
                    while (l < r) {
                        q.clear();
                        int mid = (l + r) / 2;
                        for (int k = 0; k <= mid; k++) q.push_back(v[j][k]);
                        q.push_back(i);
                        res = Query(q);
                        if (res < q.size()) r = mid;
                        else l = mid + 1;
                    }
                    adj[v[j][l]].push_back(i);
                    adj[i].push_back(v[j][l]);
                    v[j].erase(v[j].begin() + l);
                } else break;
            }
        }
    }
    for (int i = 1; i <= 2 * n; i++) {
        if (ans[i]) continue;
        if ((int) adj[i].size() == 1) helper(i, adj[i][0]);
        if (ans[i]) continue;
        int r01 = Query({i, adj[i][0], adj[i][1]});
        int r12 = Query({i, adj[i][1], adj[i][2]});
        int loves;
        if (r01 == 2 && r12 == 2) loves = 1;
        else if (r01 == 2 && r12 == 1) loves = 0;
        else loves = 2;
        ban[i][loves] = true;
        int x = adj[i][loves];
        for (int j = 0; j < 3; j++) {
            if (adj[x][j] == i) ban[x][j] = true;
        }
    }
    for (int i = 1; i <= 2 * n; i++) {
        if (ans[i]) continue;
        int cnt = 0, idx = 0;
        for (int j = 0; j < adj[i].size(); j++) if (!ban[i][j]) cnt++, idx = j;
        helper(i, adj[i][idx]);
    }
}
#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...