Submission #1025451

# Submission time Handle Problem Language Result Execution time Memory
1025451 2024-07-17T03:45:24 Z huutuan The Big Prize (IOI17_prize) C++14
0 / 100
8 ms 9164 KB
#include "prize.h"

#include <bits/stdc++.h>

using namespace std;

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;

template<class T>
using ordered_set=tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

vector<int> mem[200000];

vector<int> Ask(int i){
   if (mem[i].size()) return mem[i];
   return mem[i]=ask(i);
}

int find_best(int n) {
   for (int i=0; i<n; ++i) mem[i].clear();
   // if (n<=5000){
   //    for (int i=0; i<n; ++i){
   //       auto tmp=Ask(i);
   //       if (tmp[0]+tmp[1]==0) return i;
   //    }
   //    return -1;
   // }
   int m=n;
   int mx=0;
   while (m>1){
      m=(int)sqrt(m);
      mx+=m;
   }
   vector<pair<int, int>> v(mx);
   for (int i=0; i<mx; ++i){
      auto tmp=Ask(i);
      v[i]={tmp[0], tmp[1]};
      if (tmp[0]+tmp[1]==0) return i;
   }
   int cnt=0;
   for (auto &i:v) cnt=max(cnt, i.first+i.second);
   ordered_set<int> id;
   vector<int> st;
   for (int i=0; i<mx; ++i) if (v[i].first+v[i].second!=cnt) id.insert(i);
   for (int i=mx; i<n; ++i) st.push_back(i);
   auto solve=[&](auto &&self, vector<int> pos, int cc){
      if (!cc || pos.empty()) return;
      int mid=((int)pos.size()-1)/2;
      vector<int> posl, posr;
      for (int j:pos){
         if (j<pos[mid]) posl.push_back(j);
         if (j>pos[mid]) posr.push_back(j);
      }
      auto tmp=Ask(pos[mid]);
      if (tmp[0]+tmp[1]!=cnt){
         // id.insert(pos[mid]);
         // pos.erase(pos.begin()+mid);
         // self(self, pos, cc-1);
         int l=mid, r=mid;
         while (l){
            --l;
            auto tmp2=Ask(pos[l]);
            if (tmp2[0]+tmp2[1]!=cnt) id.insert(pos[l]), posl.pop_back();
            else{
               int cl=tmp2[0]-id.order_of_key(pos[l]);
               int cr=tmp2[1]-((int)id.size()-id.order_of_key(pos[l]));
               self(self, posl, cl);
               self(self, posr, cr);
               return;
            }
         }
         reverse(posr.begin(), posr.end());
         while (r+1<(int)pos.size()){
            ++r;
            auto tmp2=Ask(pos[r]);
            if (tmp2[0]+tmp2[1]!=cnt) id.insert(pos[r]), posr.pop_back();
            else{
               reverse(posr.begin(), posr.end());
               int cl=tmp2[0]-id.order_of_key(pos[r]);
               int cr=tmp2[1]-((int)id.size()-id.order_of_key(pos[r]));
               self(self, posl, cl);
               self(self, posr, cr);
               return;
            }
         }
      }else{
         int cl=tmp[0]-id.order_of_key(pos[mid]);
         int cr=cc-cl;
         self(self, posl, cl);
         self(self, posr, cr);
      }
   };
   solve(solve, st, cnt-(int)id.size());
   for (int i:id){
      auto tmp=Ask(i);
      if (tmp[0]+tmp[1]==0) return i;
   }
   return -1;
}
# Verdict Execution time Memory Grader output
1 Incorrect 7 ms 9164 KB Integer -1 violates the range [0, 199999]
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 8 ms 9164 KB Integer -1 violates the range [0, 199999]
2 Halted 0 ms 0 KB -