Submission #1210860

#TimeUsernameProblemLanguageResultExecution timeMemory
1210860abczz카멜레온의 사랑 (JOI20_chameleon)C++20
64 / 100
31 ms520 KiB
#include "chameleon.h"
#include <vector>
#include <iostream>
#include <map>
#define ll int

using namespace std;

void Solve(int N) {
  map <ll, ll> mp[2*N+1];
  bool done[2*N+1];
  ll A[2*N+1], B[2*N+1];
  vector <ll> V[4], U, tmp;
  for (int i=1; i<=2*N; ++i) {
    A[i] = B[i] = -1;
    done[i] = 0;
    U.push_back(i);
  }
  for (int i=0; i<4; ++i) {
    tmp.clear();
    for (int j=0; j<U.size(); ++j) {
      V[i].push_back(U[j]);
      if (V[i].size() == 1) continue;
      else if (Query(V[i]) != V[i].size()) {
        tmp.push_back(U[j]);
        V[i].pop_back();
      }
    }
    swap(U, tmp);
  }
  for (int i=1; i<=2*N; ++i) {
    for (int j=0; j<4; ++j) {
      while (true) {
        bool ok = 1;
        tmp.clear();
        for (auto u : V[j]) {
          if (u == i) ok = 0;
          else if (!mp[i].count(u)) tmp.push_back(u);
        }
        if (ok) {
          tmp.push_back(i);
          if (tmp.size() == 1 || Query(tmp) == tmp.size()) break;
          ll l = 0, r = tmp.size()-1, mid;
          while (l < r) {
            mid = (l+r)/2;
            U.clear();
            for (int j=l; j<=mid; ++j) {
              U.push_back(tmp[j]);
            }
            U.push_back(i);
            if (Query(U) == U.size()) l = mid+1;
            else r = mid;
          }
          ++mp[i][tmp[l]];
          ++mp[tmp[l]][i];
          swap(tmp[l], tmp[tmp.size()-1]);
          tmp.pop_back();
        }
        else break;
      }
    }
  }
  for (int i=1; i<=2*N; ++i) {
    tmp.clear();
    for (auto [x, y] : mp[i]) {
      tmp.push_back(x);
    }
    if (tmp.size() == 3) {
      for (int j=0; j<3; ++j) {
        U = {tmp[j], tmp[(j+1)%3], i};
        if (Query(U) == 1) {
          A[i] = tmp[(j+2)%3];
          B[tmp[(j+2)%3]] = i;
          break;
        }
      }
    }
  }
  for (int i=1; i<=2*N; ++i) {
    if (done[i]) continue;
    for (auto [x, y] : mp[i]) {
      if (x == A[i] || x == B[i]) continue;
      Answer(i, x);
      done[i] = done[x] = 1;
      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...