제출 #810757

#제출 시각아이디문제언어결과실행 시간메모리
810757MyCodeA Difficult(y) Choice (BOI21_books)C++17
30 / 100
166 ms860 KiB
#include <bits/stdc++.h>

#include "books.h"

using namespace std;

void solve(int n, int k, long long A, int S) {
    if (S == n) {
        long long a[n + 1];
        for (int i = 1; i <= n; i++)
            a[i] = skim(i);
        long long pref[n + 1];
        pref[0] = 0;
        for (int i = 1; i <= n; i++)
            pref[i] = a[i] + pref[i - 1];
        function<long long(int, int)> sum = [&](int l, int r) {
            return pref[r] - pref[l - 1];
        };
        for (int i = 1; i <= n; i++) {
            if (sum(i, i + k - 1) >= A && sum(i, i + k - 1) <= 2 * A) {
                vector<int> ans;
                for (int j = i; j < i + k; j++)
                    ans.emplace_back(j);
                answer(ans);
                return;
            }
        };
        long long s[n + 1];
        for (int i = 1; i + k - 2 <= n; i++)
            s[i] = sum(i, i + k - 2);
        for (int i = k; i <= n; i++) {
            int l = 1, r = i - k + 1;
            while (r - l > 1) {
                int m = (l + r) >> 1;
                if (s[m] + a[i] >= A)
                    r = m;
                else
                    l = m;
            }
            int ind = -1;
            if (s[l] + a[i] >= A)ind = l;
            else if (s[r] + a[i] >= A)ind = r;
            if (ind != -1 && s[ind] + a[i] <= 2 * A) {
                vector<int> ans;
                for (int j = ind; j < ind + k - 1; j++)
                    ans.emplace_back(j);
                ans.emplace_back(i);
                answer(ans);
                return;
            }
        }
        impossible();
        return;
    }
    function<long long(int)> get = [&](int i) {
        long long sum = 0;
        for (int j = i; j < i + k; j++)
            sum += skim(j);
        return sum;
    };
    int l = 1, r = n - k + 1;
    while (r - l > 1) {
        int m = (l + r) / 2;
        if (get(m) >= A)
            r = m;
        else
            l = m;
    }
    int ind = -1;
    long long s1 = get(l), s2 = get(r);
    if (s1 >= A && s1 <= 2 * A) {
        ind = l;
    } else if (s2 >= A && s2 <= 2 * A) {
        ind = r;
    }
    if (ind == -1) {
        impossible();
        return;
    }
    vector<int> ans;
    for (int j = ind; j < ind + k; j++)
        ans.emplace_back(j);
    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...