Submission #990196

#TimeUsernameProblemLanguageResultExecution timeMemory
990196canadavid1Ancient Machine 2 (JOI23_ancient2)C++17
37 / 100
82 ms596 KiB
#include "ancient2.h"

#include <string>
#include <vector>
#include <algorithm>
#include <numeric>


std::string Solve(int N) {
  // query one bit:
  // a[i], b[i] = i+1
  // a[b] = 1000
  // b[b] = 1001
  // a,b[1000] = 1000
  // a,b[1001] = 1001
  int Np = 500;
  std::vector<int> a(Np+2);
  std::iota(a.begin(),a.begin()+Np,1);
  a[Np] = Np;
  a[Np+1] = Np+1;
  auto b = a;
  std::string s;
  std::string sb;
  for(int i = 0; i < Np; i++)
  {
    a[i] = Np;
    b[i] = Np+1;
    s.push_back((Query(Np+2,a,b)>Np) ? '1' : '0');
    a[i] = i+1;
    b[i] = i+1;
  }
  a[-1+Np/2] = 0;
  b[-1+Np/2] = 0;
  a[Np-1] = Np/2;
  b[Np-1] = Np/2;
  for(int i = Np; i < Np + (Np/2); i++)
  {
    auto f = Np/2;
    // query xor of bits in residue class
    b[i%f] = f+(1+i)%f;
    b[f+(i%f)] = (1+i)%f;
    s.push_back((Query(a.size(),a,b)>=f ? '1' : '0'));
    b[i%f] = (1+i)%f;
    b[f+(i%f)] = f+(1+i)%f;
  }
  
  
  for(int i = Np+(Np/2); i < N; i++)
  {
    auto f = Np/2;
    b[i%f] = f + ((1+i)%f);
    a[f+(i%f)] = (i+1)%f;
    s.push_back((Query(a.size(),a,b)>=f ? '1' : '0'));
    b[i%f] = ((1+i)%f);
    a[f+(i%f)] = f + ((1+i)%f);
  }
  for(int i = 0; i < 250; i++)
  {
    s[500+i] = ((s[i]=='1') ^ (s[250+i]=='1') ^ (s[500+i]=='1') ^ (s[750+i]=='1')) ? '1' : '0';
  }

  return s;
  // now know last 50 bits

  // use that information somehow
    // can query xor of arithmetic sequences (up to 50 long)
    // count how many 1's
  
}
#Verdict Execution timeMemoryGrader output
Fetching results...