Submission #1362793

#TimeUsernameProblemLanguageResultExecution timeMemory
1362793khanhphucscratchChameleon's Love (JOI20_chameleon)C++20
100 / 100
37 ms560 KiB
#include "chameleon.h"
#include<bits/stdc++.h>
using namespace std;
vector<int> ad[1005];
vector<int> concat(vector<int> vec, int x)
{
    vec.push_back(x); return vec;
}
int ask(vector<int> p)
{
    return p.size() - Query(p);
}
void Solve(int n) {
    for(int i = 1; i <= 2*n; i++) ad[i].clear();
    vector<vector<int>> vec(4);
    for(int i = 1; i <= 2*n; i++){
        set<int> occured;
        for(int j = 0; j < 4; j++){
            vector<int> cur = vec[j];
            //get rid of the edges
            while(ad[i].size() < 3 && ask(concat(cur, i)) > 0){
                int l = 0, r = cur.size() - 1, p = -1;
                while(l <= r){
                    int mid = (l+r)/2;
                    vector<int> question;
                    for(int k = 0; k <= mid; k++) question.push_back(cur[k]);
                    question.push_back(i);
                    if(ask(question) > 0){p = mid; r = mid-1;}
                    else l = mid+1;
                }
                int u = cur[p], v = i;
                ad[u].push_back(v); ad[v].push_back(u);
                cur.erase(cur.begin() + p);
                occured.insert(j);
            }
        }
        int p = 0;
        while(occured.count(p) == 1) p++;
        vec[p].push_back(i);
    }
    /*for(int u = 1; u <= 2*n; u++){
        cerr<<"A"<<u<<endl;
        for(int v : ad[u]) cerr<<v<<" ";
        cerr<<endl;
    }*/
    //Now we have all edges, time to do some magic
    set<pair<int, int>> directed;
    for(int u = 1; u <= 2*n; u++) if(ad[u].size() == 3){
        //If ad[u].size() == 1, we wont talk about that
        int x1 = ad[u][0], x2 = ad[u][1], x3 = ad[u][2];
        int y1 = ask({u, x2, x3}), y2 = ask({u, x1, x3}), y3 = ask({u, x1, x2});
        int v = 0;
        if(y1 == 2) v = x1;
        else if(y2 == 2) v = x2;
        else v = x3;
        if(u < v) directed.insert({u, v});
        else directed.insert({v, u});
    }
    //Find the pair
    for(int u = 1; u <= 2*n; u++) for(int v : ad[u]) if(u < v && directed.count({u, v}) == 0){
        Answer(u, v);
    }
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...