This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "prize.h"
#include "bits/stdc++.h"
using namespace std;
#define FAST ios_base::sync_with_stdio(false); cin.tie(0);
#define pb push_back
#define eb emplace_back
#define ins insert
#define f first
#define s second
#define cbr cerr<<"hi\n"
#define mmst(x, v) memset((x), v, sizeof ((x)))
#define siz(x) ll(x.size())
#define all(x) (x).begin(), (x).end()
#define lbd(x,y) (lower_bound(all(x),y)-x.begin())
#define ubd(x,y) (upper_bound(all(x),y)-x.begin())
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); //can be used by calling rng() or shuffle(A, A+n, rng)
inline long long rand(long long x, long long y) { return rng() % (y+1-x) + x; } //inclusivesss
string inline to_string(char c) {string s(1,c);return s;} template<typename T> inline T gcd(T a,T b){ return a==0?llabs(b):gcd(b%a,a); }
using ll=long long;
using ld=long double;
#define FOR(i,s,e) for(int i=s;i<=ll(e);++i)
#define DEC(i,s,e) for(ll i=s;i>=ll(e);--i)
using pi=pair<ll,ll>; using spi=pair<ll,pi>; using dpi=pair<pi,pi>;
long long LLINF = 1e18;
int INF = 1e9+1e6;
#define MAXN (200006)
int n, others, ans=-1, l, r, co2, choice;
int memo[MAXN][2];
vector<int> my_ask(int ind) {
if(memo[ind][0]==-1) {
vector<int> tmp = ask(ind);
memo[ind][0] = tmp[0], memo[ind][1] = tmp[1];
}
return vector<int>{memo[ind][0], memo[ind][1]};
}
void dnc(int s,int e,int many,int infront,int co) {
s = max(s, l), e = min(e, r);
if(s > e || many == 0) return;
++ co2;
if(many == 1) {
int st = s-1, en = e;
vector<int> memo=my_ask(en);
while(en-st>1) {
int mid = (st+en) >> 1;
vector<int> res = my_ask(mid);
if(res[0]+res[1] != others || res[0] - infront) en = mid, memo = res;
else st = mid;
}
if(memo[0]+memo[1]==0) ans=en;
if(memo[0]==0) l=en+1;
if(memo[1]==0) r=en-1;
return;
}
int mid = (s+e) >> 1, omid = mid;
vector<int> res = my_ask(mid);
if(res[0] == 0) l=max(l, mid+1);
if(res[1] == 0) r=min(r, mid-1);
while(res[0]+res[1] != others) {
if(res[0]+res[1]==0) ans=mid;
if(res[0] == 0) l=max(l, mid+1);
if(res[1] == 0) r=min(r, mid-1);
if(mid == s) {
dnc(omid+1, e, many - (omid - s + 1), infront + (omid - s + 1), co+1);
return;
}
-- mid;
res = my_ask(mid);
}
if((choice == 1 && co%2==0) || (choice == 0 && (co2 & 1))) {
dnc(s, mid-1, res[0] - infront, infront, co);
dnc(omid+1, e, many - (res[0] - infront) - (omid - mid), res[0] + (omid - mid), !co);
} else {
dnc(omid+1, e, many - (res[0] - infront) - (omid - mid), res[0] + (omid - mid), !co);
dnc(s, mid-1, res[0] - infront, infront, co);
}
}
int find_best(int N) { n = N, r = n-1, mmst(memo, -1);
vector<int> p;
FOR(i,0,n-1) p.eb(i);
FOR(i,0,3) shuffle(all(p), rng);
choice = rand(0, 1);
FOR(ii,0,min(n-1,473)) {
int i=p[ii];
vector<int> res = my_ask(i);
others = max(res[0]+res[1], others);
if(res[0] == 0) l=max(l, i+1);
if(res[1] == 0) r=min(r, i-1);
if(res[0]==res[1]&&res[0]==0) return i;
}
dnc(0, n-1, others, 0, 0), assert(~ans);
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |