Submission #1000286

#TimeUsernameProblemLanguageResultExecution timeMemory
1000286UnforgettableplChameleon's Love (JOI20_chameleon)C++17
44 / 100
24 ms460 KiB
#include <bits/stdc++.h>
using namespace std;
 
int Query(const std::vector<int> &p);
void Answer(int a, int b);

void Solve1(int N) {
    int n = N;
    vector<bool> visited(2*n+1);
    for(int i=1;i<=2*n;i++){
        if(visited[i])continue;
        visited[i]=true;
        int ans = 1;
        for(int jump=512;jump;jump/=2){
            if(ans+jump>2*n)continue;
            vector<int> q;
            for(int j=1;j<ans+jump;j++)if(!visited[j])q.emplace_back(j);
            auto base = Query(q);
            q.emplace_back(i);
            if(Query(q)!=base)ans+=jump;
        }
        visited[ans]=true;
        Answer(i,ans);
    }
}

void Solve(int N) {
    int n = N;
    if(n>50){
        Solve1(n);
        return;
    }
    vector<vector<int>> adj(2*n+1);
    set<pair<int,int>> edges;
    for(int i=1;i<=2*n;i++){
        for(int j=i+1;j<=2*n;j++){
            if(Query({i,j})==1){
                edges.insert({i,j});
                adj[i].emplace_back(j);
                adj[j].emplace_back(i);
            }
        }
    }
    for(int i=1;i<=2*n;i++){
        if(adj[i].size()==1)continue;
        assert(adj[i].size()==3);
        if(Query({i,adj[i][0],adj[i][1]})==1)edges.erase({min(i,adj[i][2]),max(i,adj[i][2])});
        else if(Query({i,adj[i][0],adj[i][2]})==1)edges.erase({min(i,adj[i][1]),max(i,adj[i][1])});
        else edges.erase({min(i,adj[i][0]),max(i,adj[i][0])});
    }
    for(auto[a,b]:edges)Answer(a,b);
}
#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...