Submission #935512

#TimeUsernameProblemLanguageResultExecution timeMemory
9355121075508020060209tcChameleon's Love (JOI20_chameleon)C++14
100 / 100
33 ms648 KiB
#include "chameleon.h"
#include <vector>
#include<bits/stdc++.h>
using namespace std;
int n;
vector<int>e[2010];

int slv(int a,vector<int>vc){
if(Query({a,vc[0],vc[1]})==1){
    return vc[2];
}
if(Query({a,vc[0],vc[2]})==1){
    return vc[1];
}
return vc[0];
}

void fsolve(){
vector<int>lvlv(n*2+10,0);
vector<int>ans(n*2+10,0);
vector<int>love(n*2+10,0);

for(int i=1;i<=n*2;i++){
    if(e[i].size()==1){
        ans[i]=e[i][0];
        lvlv[i]=1;
    }
}
for(int i=1;i<=n*2;i++){
    if(e[i].size()==3){
        love[i]=slv(i,e[i]);
    }
}
for(int i=1;i<=n*2;i++){
    if(e[i].size()==1){continue;}
    if(e[i].size()==3){
    if(e[i][0]!=love[i]&&(love[e[i][0]]!=i||lvlv[e[i][0]])){ans[i]=e[i][0];}
    if(e[i][1]!=love[i]&&(love[e[i][1]]!=i||lvlv[e[i][1]])){ans[i]=e[i][1];}
    if(e[i][2]!=love[i]&&(love[e[i][2]]!=i||lvlv[e[i][2]])){ans[i]=e[i][2];}
    }
}
for(int i=1;i<=n*2;i++){
    if(ans[i]){
        ans[ans[i]]=i;
    }
}

for(int i=1;i<=n*2;i++){
    if(ans[i]<i&&ans[i]){
        Answer(i,ans[i]);
    }
}
}

int ask(int l,int r,vector<int>&ar,int v){
if(r>=ar.size()){return 1;}
vector<int>vc;
for(int i=l;i<=r;i++){
    vc.push_back(ar[i]);
}
vc.push_back(v);
if(Query(vc)<vc.size()){return 1;}
return 0;
}

vector<int>adde(int nw,vector<int>ar){
vector<int>ret;
vector<int>vc=ar;
vc.push_back(nw);
if(Query(vc)==vc.size()){return ret;}
int l;int r;
l=0;r=ar.size();
int lc=0;
for(int tc=0;tc<=2;tc++){
r=ar.size();
while(l<r){
    int mi=l+(r-l)/2;
    if(ask(lc,mi,ar,nw)){
        r=mi;
    }else{
        l=mi+1;
    }
}
if(l<ar.size()){
    ret.push_back(ar[l]);
}
l+=1;
lc=l;
}
return ret;
}


int uf[2010];
int uv[2010];
int usz[2010];
int fin(int x){
if(uf[x]==x){return x;}
return fin(uf[x]);
}
int finv(int x){
if(uf[x]==x){return 0;}
return (finv(uf[x])+uv[x])%2;
}
void mrg(int a,int b){
int pa=fin(a);int pb=fin(b);
int va=finv(a);int vb=finv(b);
if(pa==pb){return;}
if(usz[pa]<usz[pb]){
    swap(pa,pb);
    swap(va,vb);
}
uf[pb]=pa;
usz[pa]+=usz[pb];
uv[pb]=(1^va^vb);
}

int vis[2010];
void Solve(int N){
n=N;
vector<int>duili;
duili.push_back(1);
vis[1]=1;
for(int i=2;i<=n+n;i++){
    vector<int>vc=duili;
    vc.push_back(i);
    if(Query(vc)==vc.size()){
        duili.push_back(i);
        vis[i]=1;
    }
}

for(int i=1;i<=n+n;i++){
    uf[i]=i;
    usz[i]=1;
    uv[i]=0;
}

for(int i=1;i<=n+n;i++){
    if(vis[i]){continue;}
    vector<int>vcl;vector<int>vcr;
    for(int j=1;j<=n+n;j++){
        if(vis[j]==0){continue;}
        if(finv(j)==0){
            vcl.push_back(j);
        }else{
            vcr.push_back(j);
        }
    }
    vector<int>tvc=adde(i,vcl);
    vector<int>tvc2=adde(i,vcr);
    for(int v:tvc){
        mrg(i,v);
        e[i].push_back(v);
        e[v].push_back(i);
    }
    for(int v:tvc2){
        mrg(i,v);
        e[i].push_back(v);
        e[v].push_back(i);
    }
    vis[i]=1;
}


fsolve();
}
/*
4
1 0 1 0 0 1 1 0
4 4 1 2 1 2 3 3
4 3 8 7 6 5 2 1


*/

Compilation message (stderr)

chameleon.cpp: In function 'int ask(int, int, std::vector<int>&, int)':
chameleon.cpp:56:5: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 | if(r>=ar.size()){return 1;}
      |    ~^~~~~~~~~~~
chameleon.cpp:62:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 | if(Query(vc)<vc.size()){return 1;}
      |    ~~~~~~~~~^~~~~~~~~~
chameleon.cpp: In function 'std::vector<int> adde(int, std::vector<int>)':
chameleon.cpp:70:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   70 | if(Query(vc)==vc.size()){return ret;}
      |    ~~~~~~~~~^~~~~~~~~~~
chameleon.cpp:84:5: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   84 | if(l<ar.size()){
      |    ~^~~~~~~~~~
chameleon.cpp: In function 'void Solve(int)':
chameleon.cpp:127:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  127 |     if(Query(vc)==vc.size()){
      |        ~~~~~~~~~^~~~~~~~~~~
#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...