Submission #1171245

#TimeUsernameProblemLanguageResultExecution timeMemory
1171245SmuggingSpunChameleon's Love (JOI20_chameleon)C++20
44 / 100
44 ms524 KiB
#include "chameleon.h"
#include<bits/stdc++.h>
using namespace std;
void Solve(int n){
    if(n <= 50){
        vector<vector<int>>pp(n << 1 | 1);
        vector<bool>vis(n << 1 | 1, false);
        for(int i = 1; i <= (n << 1); i++){
            if(!vis[i]){
                vector<int>p;
                for(int j = 1; j <= (n << 1); j++){
                    if(i != j){
                        vector<int>v = {i, j};
                        if(Query(v) == 1){
                            p.emplace_back(j);
                        }
                    }
                }
                if(p.size() == 1){
                    Answer(i, p[0]);
                    vis[i] = vis[p[0]] = true;
                }
                else{
                    pp[i] = p;
                }
            }
        }
        vector<vector<int>>candidate(n << 1 | 1);
        for(int i = 1; i <= (n << 1); i++){
            if(!vis[i]){
                vector<vector<int>>v = {{i, pp[i][0], pp[i][1]}, {i, pp[i][0], pp[i][2]}, {i, pp[i][1], pp[i][2]}};
                if(Query(v[0]) == 1){
                    candidate[i] = vector<int>{pp[i][0], pp[i][1]};
                }
                else if(Query(v[1]) == 1){
                    candidate[i] = vector<int>{pp[i][0], pp[i][2]};
                }
                else{
                    candidate[i] = vector<int>{pp[i][1], pp[i][2]};
                }
            }
        }
        for(int i = 1; i <= (n << 1); i++){
            if(!vis[i]){
                for(int& j : candidate[i]){
                    if(!vis[j] && (candidate[j][0] == i || candidate[j][1] == i)){
                        Answer(i, j);
                        vis[i] = vis[j] = true;
                        break;
                    }
                }
            }
        }
        return;
    }
    vector<vector<pair<int, int>>>g(n << 1 | 1);
    vector<int>color(n << 1 | 1);
    function<void(int)>dfs;
    dfs = [&] (int s){
        for(auto& [d, foo] : g[s]){
            if(color[d] == -1){
                color[d] = color[s] ^ 1;
                dfs(d);
            }
        }
    };
    for(int i = 2; i <= (n << 1); i++){
        fill(color.begin(), color.end(), -1);
        for(int j = 1; j < i; j++){
            if(color[j] == -1){
                color[j] = 0;
                dfs(j);
            }
        }
        vector<vector<int>>part(2);
        for(int j = 1; j < i; j++){
            part[color[j]].emplace_back(j);
        }
        for(int j = 0; j < 2; j++){
            while(true){
                vector<int>p = part[j];
                p.emplace_back(i);
                if(Query(p) == p.size()){
                    break;
                }
                int low = 0, high = int(part[j].size()) - 2, pos = high + 1;
                while(low <= high){
                    int mid = (low + high) >> 1;
                    p.clear();
                    for(int k = 0; k <= mid; k++){
                        p.emplace_back(part[j][k]);
                    }
                    p.emplace_back(i);
                    if(Query(p) == p.size()){
                        low = mid + 1;
                    }
                    else{
                        high = (pos = mid) - 1;
                    }
                }
                g[i].emplace_back(part[j][pos], -1);
                g[part[j][pos]].emplace_back(i, -1);
                part[j].erase(part[j].begin() + pos);
            }
        }
    }
    for(int i = 1; i <= (n << 1); i++){
        if(g[i].size() == 1){
            g[i][0].second = 1;
            for(auto& [u, v] : g[g[i][0].first]){
                if(u == i){
                    v = 1;
                    break;
                }
            }
            continue;
        }
        for(int j = 0; j < 3; j++){
            vector<int>p(1, i);
            for(int k = 0; k < 3; k++){
                if(j != k){
                    p.emplace_back(g[i][k].first);
                }
            }
            if(j == 0 || Query(p) == 1){
                g[i][j].second = 2;
                for(auto& [u, v] : g[g[i][j].first]){
                    if(u == i){
                        v = 3;
                        break;
                    }
                }
            }
        }
    }
    vector<bool>vis(n << 1 | 1, false);
    for(int i = 1; i <= (n << 1); i++){
        if(!vis[i]){
            for(auto& [u, v] : g[i]){
                if(v == 1 || v == -1){
                    vis[i] = vis[u] = true;
                    Answer(i, u);
                    break;
                }
            }
        }
    }
}
#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...