제출 #1349427

#제출 시각아이디문제언어결과실행 시간메모리
1349427toast12커다란 상품 (IOI17_prize)C++20
20 / 100
657 ms1114112 KiB
#include "prize.h"
#include <bits/stdc++.h>
using namespace std;

struct BIT {
    int n;
    vector<int> tree;
    void init(int n) {
        tree.resize(n+1);
        this->n = n+1;
    }
    void update(int i, int val) {
        ++i;
        for (; i < n; i += i & -i) tree[i] += val;
    }
    int sum(int r) {
        int res = 0;
        ++r;
        for (; r > 0; r -= r & -r) res += tree[r];
        return res;
    }
    int query(int l, int r) {
        return sum(r) - sum(l-1);
    }
};

int mx = 0;

BIT prizes;

int ans = 0;

void solve(int l, int r, int tot);

vector<vector<int>> asked;

vector<int> qry(int i) {
    if (asked[i][0] != -1) return asked[i];
    vector<int> res = ask(i);
    asked[i] = res;
    return res;
}

int find_best(int n) {
    prizes.init(n);
    asked.resize(n+1, vector<int>(2, -1));
    for (int i = 0; i < min(n, 3); i++) {
        vector<int> res = qry(i);
        if (res[0]+res[1] == 0) return i;
        mx = max(mx, res[0]+res[1]);
    }
    solve(0, n-1, mx);
    return ans;
}

void solve(int l, int r, int tot) {
    int mid = (l+r)/2;
    vector<int> res = qry(mid);
    vector<int> res2 = qry(r);
    vector<int> res3 = qry(l);
    if (res[0]+res[1] == 0)  {
        ans = mid;
        return;
    }
    if (res2[0]+res2[1] == 0) {
        ans = r;
        return;
    }
    if (res3[0]+res3[1] == 0) {
        ans = l;
        return;
    }
    if (res[0]+res[1] != mx) {
        if (!prizes.query(mid, mid)) prizes.update(mid, 1);
        res[0]++;
    }
    if (res[0] != res2[0]) {
        int cnt = res2[0]-res[0];
        int found = prizes.query(mid, r);
        if (found < cnt) solve(mid, r, cnt);
    }
    if (res[0] != res3[0]) {
        int cnt = res[0]-res3[0];
        int found = prizes.query(l, mid);
        if (found < cnt) solve(l, mid, cnt);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...