Submission #370286

#TimeUsernameProblemLanguageResultExecution timeMemory
370286dooweyThe Big Prize (IOI17_prize)C++14
0 / 100
119 ms1068 KiB
#include <bits/stdc++.h>
#include "prize.h"


using namespace std;
typedef long long ll;
typedef pair<int, int> pii;

#define fi first
#define se second
#define mp make_pair

map<int,pii> res;

pii get(int x){
    if(res.count(x)) return res[x];
    vector<int> g = ask(x);
    res[x] = mp(g[0], g[1]);
    return mp(g[0],g[1]);
}

int low = 0;
int n;

int solve(int li, int ri, int know){
    if(li > ri || know == -1) return -1;
    pii ash = get(li);
    if(ash.fi + ash.se == 0) return li;
    if(li == ri) return -1;
    int mid = (li + ri) / 2;
    int ca = mid;
    int cb = mid + 1;
    while(ca >= li){
        ash = get(ca);
        if(ash.fi + ash.se == 0) return ca;
        if(ash.fi + ash.se < low){
            ca -- ;
            know -- ;
        }
        else{
            break;
        }
    }
    pii fa = get(li);
    ash = get(ca);
    int faf = fa.se - ash.se;
    int tri = solve(li, ca, faf);
    if(tri != -1) return tri;
    while(cb <= ri){
        ash = get(cb);
        if(ash.fi + ash.se == 0) return cb;
        if(ash.fi + ash.se < low){
            cb ++ ;
            know--;
        }
        else{
            break;
        }
    }
    return solve(cb, ri, know - faf);
}

int find_best(int _n) {
    n = _n;
    pii cur;
    for(int i = 0 ; i < min(n,500); i ++ ){
        cur = get(i);
        if(cur.fi + cur.se == 0)
            return i;
        low = max(low, cur.fi + cur.se);
    }
    int lef = 0, rig = n - 1;
    while(1){
        pii cc = get(lef);
        if(cc.fi + cc.se == 0) return lef;
        if(cc.fi + cc.se == low)
            lef ++ ;
        else
            break;
    }
    while(1){
        pii cc = get(rig);
        if(cc.fi + cc.se == 0) return rig;
        if(cc.fi + cc.se == low)
            rig -- ;
        else
            break;
    }
    pii sa = get(lef);
    pii sb = get(rig);
	return solve(lef, rig, sa.se-sb.se);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...