제출 #351211

#제출 시각아이디문제언어결과실행 시간메모리
351211ryansee커다란 상품 (IOI17_prize)C++14
93.87 / 100
55 ms492 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;

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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...