Submission #67196

#TimeUsernameProblemLanguageResultExecution timeMemory
67196radoslav11The Big Prize (IOI17_prize)C++14
100 / 100
98 ms25584 KiB
#include <bits/stdc++.h> #include "prize.h" //#include "Lgrader.cpp" using namespace std; template<class T, class T2> inline int chkmax(T &x, const T2 &y) { return x < y ? x = y, 1 : 0; } template<class T, class T2> inline int chkmin(T &x, const T2 &y) { return x > y ? x = y, 1 : 0; } const int MAXN = (1 << 20); vector<int> memo[MAXN]; int Q = 0; bool stop; bool dummy[MAXN]; vector<int> query(int i) { if(!memo[i].empty()) return memo[i]; if(stop || dummy[i]) return vector<int>(2, 1e9); memo[i] = ask(i), Q++; if(Q == 10000) assert(false); return memo[i]; } int n; mt19937 mt(42); int cnt(int l, int r); int cnt1(int l, int r); int sum(int x) { return query(x)[0]+query(x)[1];} int better(int l, int r) { return sum(l)>sum(r); } int abetter(int l, int r) { return sum(l)>=sum(r); } int cnt1(int l, int r) { return query(r)[0] - query(l)[0]; } int cnt(int l, int r) { return query(l)[1] - query(r)[1] - better(l,r); } bool useless(int l, int r) { if(sum(l) == sum(r) && cnt1(l, r) == 0) return true; //if(query(r)[0] - query(l)[0] == 0) return true; return false; } void rec(int l, int r) { if(r < l) return; int mid = (l + r) >> 1; if(query(l - 1)[0] + query(l - 1)[1] == 0) stop = 1; if(query(mid)[0] + query(mid)[1] == 0) stop = 1; if(query(r + 1)[0] + query(r + 1)[1] == 0) stop = 1; if(useless(l - 1, r + 1)) { for(int i = l; i <= r; i++) memo[i] = query(l - 1); return; } /* if(cnt() && ) { for(int i = l; i< mid;i++)dummy[i] = 1; for(int i = mid+1; i< r+1;i++)dummy[i] = 1; return; } */ if(sum(l - 1) == sum(r + 1) && cnt1(l - 1, r + 1) == 1 && sum(l - 1) > sum(mid)) { for(int i = l; i <= r; i++) if(i != mid) dummy[i] = 1; return; } if(cnt(l - 1, mid) > cnt(mid, r + 1)) { if(useless(l - 1, mid)) for(int i = l; i < mid; i++) dummy[i] = 1; else rec(l, mid - 1); if(useless(mid, r + 1)) for(int i = mid + 1; i <= r; i++) dummy[i] = 1; else rec(mid + 1, r); } else { if(useless(mid, r + 1)) for(int i = mid + 1; i <= r; i++) dummy[i] = 1; else rec(mid + 1, r); if(useless(l - 1, mid)) for(int i = l; i < mid; i++) dummy[i] = 1; else rec(l, mid - 1); } } int find_best(int n) { ::n = n; rec(1, n - 2);stop= 1;for(int i = 0; i < n; i++) if(query(i)[0] + query(i)[1] == 0) return i; return -1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...