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;
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=ask(en);
while(en-st>1) {
int mid = (st+en) >> 1;
vector<int> res = 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 = 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 = ask(mid);
}
if(co2&1) {
dnc(s, mid-1, res[0] - infront, infront, co+1);
dnc(omid+1, e, many - (res[0] - infront) - (omid - mid), res[0] + (omid - mid), co+1);
} else {
dnc(omid+1, e, many - (res[0] - infront) - (omid - mid), res[0] + (omid - mid), co+1);
dnc(s, mid-1, res[0] - infront, infront, co+1);
}
}
int find_best(int N) { n = N, r = n-1;
FOR(i,0,min(n-1,473)) {
vector<int> res = 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... |