Submission #1030988

#TimeUsernameProblemLanguageResultExecution timeMemory
1030988coolboy19521The Big Prize (IOI17_prize)C++17
99.72 / 100
47 ms5528 KiB
#include "prize.h"
#include "iostream"
 
using namespace std;

const int sz = 2e5 + 10;

vector<int> bf[sz];
int ft[sz];
int N;

void inc(int v) {
    for (; v <= N; v += v & -v)
        ft[v] ++;
}

int sum(int le, int ri) {
    le --;
    int ql = 0;
    for (; 0 < le; le -= le & -le)
        ql += ft[le];
    int qr = 0;
    for (; 0 < ri; ri -= ri & -ri)
        qr += ft[ri];
    return qr - ql;
}

vector<int> Ask(int x) {
    if (bf[x].size()) return bf[x];
    return bf[x] = ask(x);
}
 
int find_best(int n) {
    int mx = 0, xx = 600;
    for (int i = 0; i < min(n, 600); i ++) {
        auto pr = Ask(i);
        mx = max(mx, pr[0] + pr[1]);
        if (0 == pr[0] + pr[1]) return i;
        if (30 < mx) {
            xx = i + 1;
            break;
        }
        inc(i + 1);
    }
    int ls = xx;
    while (ls < n) {
        int ps;
        for (; ls < n; ls ++) {
            auto pr = Ask(ls);
            int sm = pr[0] + pr[1];
            if (0 == sm) return ls;
            if (sm == mx) {
                ps = pr[1];
                break;
            }
            inc(ls + 1);
        }
        int ds = xx;
        int rs = n;
        while (1 < rs - ds) {
            int mi = (ds + rs) / 2;
            if (mi <= ls) {
                ds = mi;
                continue;
            }
            if (sum(ls + 1, mi + 1)) {
                rs = mi;
                continue;
            }
            auto pr = Ask(mi);
            int sm = pr[0] + pr[1];
            if (0 == sm) return mi;
            if (sm != mx) {
                inc(mi + 1);
                rs = mi;
            }
            if (0 == ps - pr[1]) ds = mi;
            else rs = mi;
        }
        ls = ds + 1;
    }
    return 0;
}

Compilation message (stderr)

prize.cpp: In function 'int find_best(int)':
prize.cpp:77:13: warning: 'ps' may be used uninitialized in this function [-Wmaybe-uninitialized]
   77 |             if (0 == ps - pr[1]) ds = mi;
      |             ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...