제출 #370312

#제출 시각아이디문제언어결과실행 시간메모리
370312doowey커다란 상품 (IOI17_prize)C++14
97.42 / 100
66 ms772 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

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
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 == 0) return -1;
    pii ash = get(li);
    if(ash.fi + ash.se == 0) return li;
    if(li == ri) return -1;
    int mid = (li + ri + 1) / 2;
    pii qad = get(mid);
    if(qad.fi + qad.se == 0) return mid;
    if(qad.fi + qad.se == low){
        int dir = ((int)rng() % 2 + 2) % 2; // adaptivness is prob already broken
        if(dir == 0){
            int fa = solve(li, mid - 1, ash.se - qad.se);
            if(fa != -1) return fa;
            int fb = solve(mid, ri, know - (ash.se - qad.se));
            return fb;
        }
        else{
            int fb = solve(mid, ri, know - (ash.se - qad.se));
            if(fb != -1) return fb;
            int fa = solve(li, mid - 1, ash.se - qad.se);
            return fa;
        }
    }
    int cic = know;
    int nw = mid;
    int inb = 0;
    while(nw <= ri){
        qad = get(nw);
        if(qad.fi + qad.se == 0) return nw;
        if(qad.fi + qad.se < low){
            nw ++ ;
            inb ++ ;
        }
        else{
            break;
        }
    }
    int fa = solve(nw, ri, know - (ash.se - qad.se));
    if(fa != -1) return fa;
    fa = solve(li, mid - 1,ash.se - qad.se - inb);
    return fa;
}

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;
    }
    cur = get(lef);
	return solve(lef, n - 1, cur.se);
}

컴파일 시 표준 에러 (stderr) 메시지

prize.cpp: In function 'int solve(int, int, int)':
prize.cpp:48:9: warning: unused variable 'cic' [-Wunused-variable]
   48 |     int cic = know;
      |         ^~~
prize.cpp: In function 'int find_best(int)':
prize.cpp:77:18: warning: unused variable 'rig' [-Wunused-variable]
   77 |     int lef = 0, rig = n - 1;
      |                  ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...