Submission #1206604

#TimeUsernameProblemLanguageResultExecution timeMemory
1206604HappyCapybaraSphinx's Riddle (IOI24_sphinx)C++20
64 / 100
41 ms3636 KiB
#include "sphinx.h"
#include<bits/stdc++.h>
using namespace std;

int N;
vector<int> C, num;

void solve(int l, int r, int c, int z=-1){
  if (r < l) return;
  int p = (l % 2);
  if (r % 2 != p) r--;
  //cout << l << " " << r << " " << c << endl;
  if (l == 0){
    vector<int> v(N, N);
    v[l] = -1;
    v[l+1] = c;
    if (C[l] == -1 && perform_experiment(v) < min(N, 3)){
      C[l] = c;
      num[c]++;
    }
    solve(l+2, r, c);
    return;
  }
  if (r == N-1){
    vector<int> v(N, N);
    v[r] = -1;
    v[r-1] = c;
    if (C[r] == -1 && perform_experiment(v) < min(N, 3)){
      C[r] = c;
      num[c]++;
    }
    solve(l, r-2, c);
    return;
  }
  int x = 0;
  for (int i=l; i<=r; i++) x += (C[i] == -1);
  if (x == 0) return;
  vector<int> v(N, N);
  for (int i=l; i<=r; i+=2) v[i] = -1;
  for (int i=1-p; i<N; i+=2) v[i] = c;
  if (z == -1) z = (N-perform_experiment(v))/2;
  if (z == 0) return;
  if (z == x){
    num[c] += z;
    for (int i=l; i<=r; i+=2){
      if (C[i] == -1) C[i] = c;
    }
    return;
  }
  int exp = num[c]+z;
  int m = (l+r)/2;
  if (m % 2 != p) m--;
  solve(l, m, c);
  if (num[c] != exp) solve(m+2, r, c, exp-num[c]);
}

vector<int> find_colours(int N, vector<int> X, vector<int> Y){
  ::N = N;
  C.resize(N, -1);
  int M = X.size();
  if (N <= 50){
    for (int bruh=0; bruh<2*M; bruh++){
      int i = bruh % M;
      if (C[X[i]] == -1){
        vector<int> v(N, N);
        v[X[i]] = 0;
        v[Y[i]] = 0;
        int tar = perform_experiment(v);
        for (int j=0; j<N; j++){
          v[X[i]] = -1;
          v[Y[i]] = j;
          if (perform_experiment(v) == tar){
            C[X[i]] = j;
            break;
          }
        }
      }
      swap(X[i], Y[i]);
    }
    return C;
  }
  if (M == N*(N-1)/2){
    for (int i=0; i<N; i++){
      int l = 0, r = N;
      while (l < r-1){
        int m = (l+r)/2;
        int cur = 0;
        vector<int> v(N, -1);
        for (int j=0; j<N; j++){
          if (i == j) continue;
          v[j] = cur;
          if (cur < m-1) cur++;
        }
        if (perform_experiment(v) == m) r = m;
        else l = m;
      }
      C[i] = l;
    }
    return C;
  }
  num.resize(N, 0);
  for (int i=0; i<N; i++){
    solve(0, N-1, i);
    solve(1, N, i);
  }
  return C;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...