Submission #751392

#TimeUsernameProblemLanguageResultExecution timeMemory
751392vjudge1A Difficult(y) Choice (BOI21_books)C++17
20 / 100
255 ms976 KiB
#include <bits/stdc++.h>
#include "books.h"
using namespace std;
#define int long long
#define pb push_back

int n, k, a, s;
vector<int> v;

void ans_start(int idx) {
    vector<signed> ans;
    for(int i = idx; i < idx + k; i++) {
        ans.pb(i);
    }
    answer(ans);
}

bool tryskim(int i) {
    if(v[i] == -1) {
        v[i] = skim(i);
        return true;
    }
    return false;
}

void solve(signed N, signed K, int A, signed S) {
    n = N, k = K, a = A, s = S;
    v.assign(1 + n, -1);
    if(n <= s) {
        for(int i = 1; i <= n; i++) {
            v[i] = skim(i);
        }
        /*for(int i = 1; i <= n; i++) {
            if(v[i] > a) {
                n = i;
                v.resize(n);
                break;
            }
        }
        if(n < k) {
            impossible();
        }*/
        int sum = 0;
        for(int i = 1; i <= k; i++) {
            sum += v[i];
        }
        if(sum > 2 * a) {
            impossible();
        }
        if(sum >= a) {
            ans_start(1);
        }
        for(int j = 2; j + k - 1 <= n; j++) {
            sum -= v[j - 1];
            sum += v[j + k - 1];
            if(sum >= a && sum <= 2 * a) {
                ans_start(j);
            }
        }
        sum = 0;
        for(int i = 1; i <= k - 1; i++) {
            sum += v[i];
        }
        int spec = -1;
        for(int i = k; i <= n; i++) {
            if(v[i] >= a) {
                sum += v[i];
                spec = i;
                break;
            }
        }
        if(spec != -1) {
            if(sum >= a && sum <= 2 * a) {
                vector<signed> ans;
                for(int i = 1; i <= k - 1; i++) {
                    ans.pb(i);
                }
                ans.pb(spec);
                answer(ans);
            }
        }
        impossible();
    }
    int sum = 0;
    for(int i = 1; i <= k - 1; i++) {
        tryskim(i);
        sum += v[i];
    }
    int l = k, r = n + 1;
    while(l < r - 1) {
        int mid = (l + r) / 2;
        tryskim(mid);
        if(sum + v[mid] <= 2 * a) {
            l = mid;
        } else {
            r = mid;
        }
    }
    tryskim(l);
    if(sum + v[l] >= a && sum + v[l] <= 2 * a) {
        vector<signed> ans;
        for(int i = 1; i <= k - 1; i++) {
            ans.pb(i);
        }
        ans.pb(l);
    }
    if(sum + v[l] > 2 * a) {
        impossible();
    }
    sum = 0;
    for(int i = l - k + 1; i <= l; i++) {
        tryskim(i);
        sum += v[i];
    }
    if(sum >= a && sum <= 2 * a) {
        ans_start(l - k + 1);
    } else {
        impossible();
    }
}
#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...