Submission #847887

#TimeUsernameProblemLanguageResultExecution timeMemory
847887MinaRagy06A Difficult(y) Choice (BOI21_books)C++17
80 / 100
2 ms1364 KiB
#include <bits/stdc++.h>
#ifdef MINA
    #include "grader.cpp"
#else
    #ifdef DEBUG
        #include "grader2.cpp"
    #endif
#endif
#include "books.h"
#define ll long long
using namespace std;
 
ll b[100'005];
ll ask(int i) {
    if (~b[i]) return b[i];
    return b[i] = skim(i + 1);
}
void solve(int n, int k, ll a, int Q) {
    memset(b, -1, sizeof b);
    if (Q >= 170) {
        ll s1 = 0;
        for (int i = 0; i < k - 1; i++) {
            s1 += ask(i);
        }
        int l = 0, r = n - 1;
        while (l <= r) {
            int md = ((l + r) >> 1);
            ll s = ask(md);
            if (s >= a) {
                if (s1 + s <= 2 * a) {
                    vector<int> ans;
                    for (int j = 0; j < k - 1; j++) {
                        ans.push_back(j + 1);
                    }
                    ans.push_back(md + 1);
                    answer(ans);
                } else {
                    r = md - 1;
                    continue;
                }
            } else {
                l = md + 1;
            }
        }
        l = 0, r = n - k;
        while (l <= r) {
            int md = ((l + r)) >> 1;
            ll s = 0;
            for (int i = md; i < md + k; i++) {
                s += ask(i);
            }
            if (s < a) {
                l = md + 1;
            } else if (s > 2 * a) {
                r = md - 1;
            } else {
                vector<int> ans;
                for (int j = md; j < md + k; j++) {
                    ans.push_back(j + 1);
                }
                answer(ans);
            }
        }
        impossible();
    } else {
        ll s = 0;
        for (int i = 0; i < k; i++) {
            s += ask(i);
        }
        if (s > 2 * a) {
            impossible();
        }
        if (a <= s && s <= 2 * a) {
            vector<int> ans;
            for (int i = 0; i < k; i++) {
                ans.push_back(i + 1);
            }
            answer(ans);
        }
        if (k == n) {
            impossible();
        }
        int cur = k - 1, nxt = n - 1;
        while (s < a && n - nxt <= k) {
            s -= ask(cur);
            cur--;
            s += ask(nxt);
            nxt--;
        }
        if (s < a) {
            impossible();
        }
        if (s <= 2 * a) {
            vector<int> ans;
            for (int i = 0; i <= cur; i++) {
                ans.push_back(i + 1);
            }
            for (int i = nxt + 1; i < n; i++) {
                ans.push_back(i + 1);
            }
            answer(ans);
        }
        nxt++;
        s -= ask(nxt);
        int l = cur + 1, r = nxt - 1;
        while (l <= r) {
            int md = (l + r) >> 1;
            if (s + ask(md) < a) {
                l = md + 1;
            } else if (s + ask(md) > 2 * a) {
                r = md - 1;
            } else {
                vector<int> ans;
                for (int i = 0; i <= cur; i++) {
                    ans.push_back(i + 1);
                }
                for (int i = nxt + 1; i < n; i++) {
                    ans.push_back(i + 1);
                }
                ans.push_back(md + 1);
                answer(ans);
            }
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...