Submission #1285028

#TimeUsernameProblemLanguageResultExecution timeMemory
1285028mariaclaraThe Big Prize (IOI17_prize)C++17
100 / 100
13 ms440 KiB
#include "prize.h"
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
#define mk make_pair
#define pb push_back
#define fr first
#define sc second

int max_loli;

int query(int l, int r, int pl, int pr) {
    int ml = (l+r)/2 - 1, mr = ml + 1, pml = pr, pmr = -1;

    while(mr <= r) {
        vi rsp = ask(mr);

        if(rsp[0] + rsp[1] == max_loli) {
            pml = rsp[0] - (mr - ml - 1);
            pmr = rsp[0];
            mr++;
            break;
        }

        if(rsp[0] + rsp[1] == 0) return mr;
        mr++; pml--;
    }

    int ret = -1;
    if(pl < pml and l <= ml) ret = query(l, ml, pl, pml);
    if(pmr < pr and mr <= r and ret == -1) ret = query(mr, r, pmr, pr);

    return ret;
}

int find_best(int N) {
    const int C = max(N/500, 1);
    vi L, R, A, B;

    for(int i = 0; i < N; i += C) {
        L.pb(i);
        R.pb(min(N-1, i+C-1));
        vi rsp = ask(R.back());
        if(rsp[0] + rsp[1] == 0) return R.back();
        A.pb(rsp[0]);
        B.pb(rsp[1]);
        max_loli = max(max_loli, rsp[0] + rsp[1]);
    }

    int ans = -1, last_pref = 0;

    for(int i = 0; i < sz(L); i++) {
        int l = L[i], r = R[i]-1, at_pref = -1;

        if(A[i] + B[i] == max_loli) at_pref = A[i];

        while(at_pref == -1 and r >= l) {
            vi rsp = ask(r);

            if(rsp[0] + rsp[1] == max_loli) at_pref = rsp[0];
            if(rsp[0] + rsp[1] == 0) return r;
            r--;
        }

        if(last_pref < at_pref and l <= r)
            ans = max(ans, query(l, r, last_pref, at_pref));
        
        last_pref = at_pref + (R[i] - r - 1);
    }

    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...