제출 #351226

#제출 시각아이디문제언어결과실행 시간메모리
351226ryansee커다란 상품 (IOI17_prize)C++14
0 / 100
570 ms1048580 KiB
#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 = my_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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...