Submission #1224434

#TimeUsernameProblemLanguageResultExecution timeMemory
1224434SpyrosAlivA Difficult(y) Choice (BOI21_books)C++20
0 / 100
1 ms1176 KiB
#include "books.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long

int n, k, s;
ll a;

void solve(int N, int K, ll A, int S) {
    n = N;
    k = K;
    a = A;
    s = S;
    vector<ll> arr(n+1);
    for (int i = 1; i <= k; i++) {
        arr[i] = skim(i);
    }
    ll currS = 0;
    vector<int> index(k+2);
    for (int i = 1; i <= k; i++) {
        currS += arr[i];
        index[i] = i;
    }
    index[k+1] = n+1;
    for (int curr = k; curr >= 1; curr--) {
        if (currS >= a && currS <= 2*a) break;
        int allow = index[curr+1] - 1;
        if (allow == curr) continue;
        int lo = curr+1, hi = allow;
        int idx = -1;
        while (lo <= hi) {
            int mid = (lo + hi) / 2;
            ll val = skim(mid);
            ll tot = currS - arr[curr] + val;
            if (tot >= a && tot <= 2 * a) {
                index[curr] = mid;
                vector<int> fin;
                for (int i = 1; i <= k; i++) {
                    fin.push_back(index[i]);
                }
                answer(fin);
                return;
            }
            if (tot > 2 * a) {
                hi = mid-1;
            }
            else {
                idx = mid;
                lo = mid+1;
            }
        }
        if (idx == -1) {
            impossible();
            return;
        }
        currS -= arr[curr];
        currS += arr[idx];
        index[curr] = idx;
    }
    if (currS > 2 * a || currS < a) {
        impossible();
        return;
    }
    else {
        vector<int> fin;
        for (int i = 1; i <= k; i++) {
            fin.push_back(index[i]);
        }
        answer(fin);
        return;
    }
}
#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...