Submission #1146064

#TimeUsernameProblemLanguageResultExecution timeMemory
1146064byunjaewooChameleon's Love (JOI20_chameleon)C++20
100 / 100
44 ms524 KiB
#include "chameleon.h"
#include <bits/stdc++.h>
using namespace std;

const int N=1010;
int chk[N];
vector<int> adj[N];

void Solve(int N) {
  for(int i=1; i<=2*N; i++) {
    fill(chk+1, chk+2*N+1, -1);
    vector<int> a[2];
    function<void(int, int)> dfs=[&](int curr, int c) {
      chk[curr]=c;
      a[c].push_back(curr);
      for(int next:adj[curr]) if(chk[next]<0) dfs(next, 1-c);
    };
    auto query2=[&](int a, int b) {
      vector<int> tmp;
      tmp.push_back(a), tmp.push_back(b);
      if(Query(tmp)!=1) return false;
      tmp.clear();
      for(int i=1; i<=2*N; i++) if(i!=a && i!=b) tmp.push_back(i);
      return Query(tmp)<=N-1;
    };
    for(int j=1; j<i; j++) if(chk[j]<0) dfs(j, 0);
    for(int j=0; j<2; j++) if(a[j].size()) {
      while(true) {
        a[j].push_back(i);
        if(Query(a[j])==a[j].size()) {
          a[j].pop_back();
          break;
        }
        a[j].pop_back();
        int p=0;
        for(int s=0, e=a[j].size()-1; s<e; ) {
          int m=(s+e)/2;
          vector<int> v;
          for(int k=s; k<=m; k++) v.push_back(a[j][k]);
          v.push_back(i);
          if(Query(v)==v.size()) s=p=m+1;
          else e=m;
        }
        if(query2(i, a[j][p])) Answer(i, a[j][p]);
        adj[i].push_back(a[j][p]), adj[a[j][p]].push_back(i);
        swap(a[j][p], a[j].back()), a[j].pop_back();
      }
    }
  }
}
#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...