Submission #1169564

#TimeUsernameProblemLanguageResultExecution timeMemory
1169564huutuanToxic Gene (NOI23_toxic)C++20
7.06 / 100
4 ms328 KiB
#include "toxic.h"

#include <bits/stdc++.h>

using namespace std;

void determine_type(int n){
   vector<int> ct(n*4, -1), cr(n*4, -1), ctr(n*4, -1), cs(n*4, -1);
   auto query=[&](int l, int r) -> int {
      vector<int> v(r-l+1);
      iota(v.begin(), v.end(), l);
      return query_sample(v);
   };
   int id_t=0;
   {
      int l=1, r=n-1;
      while (l<=r){
         int mid=(l+r)>>1;
         if (query(1, mid)!=mid) r=mid-1;
         else l=mid+1;
      }
      id_t=l;
   }
   auto query_t=[&](int l, int r) -> int {
      vector<int> v(r-l+1);
      iota(v.begin(), v.end(), l);
      if (id_t<l || r<id_t){
         v.push_back(id_t);
      }
      return query_sample(v);
   };
   auto dnc_t=[&](auto &&self, int k, int l, int r) -> void {
      int c=query(l, r);
      if (c){
         for (int i=l; i<=r; ++i) answer_type(i, 'R');
         return;
      }
      if (l==r){
         answer_type(l, 'T');
         return;
      }
      int mid=(l+r)>>1;
      self(self, k<<1, l, mid);
      self(self, k<<1|1, mid+1, r);
   };
   auto dnc=[&](auto &&self, int k, int l, int r) -> void {
      if (cs[k]==-1) cs[k]=query_t(l, r);
      if (cs[k]==r-l+1){
         for (int i=l; i<=r; ++i) answer_type(i, 'S');
         return;
      }
      if (cs[k]==0) return dnc_t(dnc_t, k, l, r);
      assert(l!=r);
      int mid=(l+r)>>1;
      self(self, k<<1, l, mid);
      cs[k<<1|1]=cs[k]-cs[k<<1];
      self(self, k<<1|1, mid+1, r);
   };
   dnc(dnc, 1, 1, n);
}
#Verdict Execution timeMemoryGrader output
Fetching results...