제출 #1026346

#제출 시각아이디문제언어결과실행 시간메모리
1026346huutuanThe Big Prize (IOI17_prize)C++14
20 / 100
42 ms10700 KiB
#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; } mx=min(mx, 200); 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); }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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...