Submission #1181742

#TimeUsernameProblemLanguageResultExecution timeMemory
1181742noyancanturkAncient Machine 2 (JOI23_ancient2)C++20
0 / 100
13 ms516 KiB
#include "ancient2.h"

#include<bits/stdc++.h>
using namespace std;

std::string Solve(int N) {
  string ans(N,0);
  for(int i=0;i<N;i++){
    if(i+3<=102){
      vector<int>a(i+3),b(i+3);
      for(int j=0;j<i;j++){
        a[j]=b[j]=j+1;
      }
      a[i]=i+1;
      b[i]=i+2;
      a[i+1]=b[i+1]=i+1;
      a[i+2]=b[i+2]=i+2;
      ans[i]=Query(i+3,a,b)==i+2;
    }else{
      int ind6=-1,ty6=-1,sz6=INT_MAX;
      for(int j=i-1;6<=j;j--){
        int sz=(j+1)/7;
        if(!ans[j]&&ans[j-sz]&&ans[j-2*sz]&&ans[j-3*sz]&&ans[j-4*sz]&&ans[j-5*sz]&&ans[j-6*sz]){
          ind6=j;
          ty6=0;
          sz6=i-6*sz;
          break;
        }
        if(ans[j]&&!ans[j-sz]&&!ans[j-2*sz]&&!ans[j-3*sz]&&!ans[j-4*sz]&&!ans[j-5*sz]&&!ans[j-6*sz]){
          ind6=j;
          ty6=1;
          sz6=i-6*sz;
          break;
        }
      }
      int ind5=-1,ty5=-1,sz5=INT_MAX;
      for(int j=i-1;5<=j;j--){
        int sz=(j+1)/6;
        if(!ans[j]&&ans[j-sz]&&ans[j-2*sz]&&ans[j-3*sz]&&ans[j-4*sz]&&ans[j-5*sz]){
          ind5=j;
          ty5=0;
          sz5=i-5*sz;
          break;
        }
        if(ans[j]&&!ans[j-sz]&&!ans[j-2*sz]&&!ans[j-3*sz]&&!ans[j-4*sz]&&!ans[j-5*sz]){
          ind5=j;
          ty5=1;
          sz5=i-5*sz;
          break;
        }
      }
      int ind4=-1,ty4=-1,sz4=INT_MAX;
      for(int j=i-1;4<=j;j--){
        int sz=(j+1)/5;
        if(!ans[j]&&ans[j-sz]&&ans[j-2*sz]&&ans[j-3*sz]&&ans[j-4*sz]){
          ind4=j;
          ty4=0;
          sz4=i-4*sz;
          break;
        }
        if(ans[j]&&!ans[j-sz]&&!ans[j-2*sz]&&!ans[j-3*sz]&&!ans[j-4*sz]){
          ind4=j;
          ty4=1;
          sz4=i-4*sz;
          break;
        }
      }
      auto f=[&](int ind,int szz,int ty,int gy)-> void {
        vector<int>a(szz+3),b(szz+3);
        for(int j=0;j<szz;j++){
          a[j]=b[j]=j+1;
        }
        int sz=(ind+1)/(gy+1);
        if(ty){
          a[ind-gy*sz]=ind-(gy+1)*sz+1;
        }else{
          b[ind-gy*sz]=ind-(gy+1)*sz+1;
        }
        a[szz]=szz+1;
        b[szz]=szz+2;
        a[szz+1]=b[szz+1]=szz+1;
        a[szz+2]=b[szz+2]=szz+2;
        ans[i]=Query(szz+3,a,b)==szz+2;
      };
      if(sz4<=sz5&&sz4<=sz6){
        f(ind4,sz4,ty4,4);
      }else if(sz5<=sz6){
        f(ind5,sz5,ty5,5);
      }else{
        f(ind6,sz6,ty6,6);
      }
    }
  }
  for(char&c:ans)c+='0';
  return ans;
}

/*
std::string Solve(int N) {
  int m = 2;
  std::vector<int> a(m), b(m);
  a[0] = 0;
  a[1] = 1;
  b[0] = 0;
  b[1] = 1;
  variable_example = Query(m, a, b);
  std::string s(N, '0');
  s[0] = '1';
  return s;
}
*/
#Verdict Execution timeMemoryGrader output
Fetching results...