Submission #1240755

#TimeUsernameProblemLanguageResultExecution timeMemory
1240755KindaGoodGamesA Difficult(y) Choice (BOI21_books)C++20
20 / 100
64 ms1372 KiB
#include <bits/stdc++.h>

#include "books.h"

#define tiii tuple<int,int,int>
#define int long long

using namespace std;
//
// --- Sample implementation for the task books ---
//
// To compile this program with the sample grader, place:
//     books.h books_sample.cpp sample_grader.cpp
// in a single folder and run:
//     g++ books_sample.cpp sample_grader.cpp
// in this folder.
//

void solve(int32_t n, int32_t K, long long A, int32_t S) {
    vector<int> arr(n);

    for(int i = 0; i < n; i++){
        arr[i] = skim(i+1);
    }

    vector<int32_t> chose(K);
    int sum = 0;
    for(int i = 0; i < K; i++){
        chose[i] = i;
        sum += arr[i];
    }

    if(sum > 2*A) {
        impossible();
    }

    priority_queue<tiii> pq;
    for(int i = K; i < n; i++){
        tiii choice = {-1,-1,i};
        
        for(int j = 0; j < K; j++){
            int del = -arr[chose[j]]+arr[i];
            if(sum+del > 2*A) continue;
            choice = max(choice, {del, j, i});
        } 

        pq.push(choice);
    }
    while(pq.size() && sum < A){
        int delta, old, nxt;

        tie(delta,old,nxt) = pq.top(); pq.pop();
        // if not current
        if(arr[nxt]-arr[chose[old]] != delta){
            // reevaluate
            tiii choice = {-1,-1,nxt};
            for(int j = 0; j < K; j++){
                if(sum-arr[chose[j]]+arr[nxt] > 2*A || -arr[chose[j]]+arr[nxt] <= 0) continue;
                choice = max(choice, {-arr[chose[j]]+arr[nxt], j, nxt});
            } 
            if(get<0>(choice) != -1){
                pq.push(choice);
            }
            continue;
        }

        int oind = chose[old];
        chose[old] = nxt;
        sum += delta; 

        // this element may be reinserted
        tiii choice = {-1,-1,oind};
        for(int j = 0; j < K; j++){
            if(sum-arr[chose[j]]+arr[oind] > 2*A || -arr[chose[j]]+arr[oind] <= 0) continue;
            choice = max(choice, {-arr[chose[j]]+arr[oind], j, oind});
        } 
        if(get<0>(choice) != -1){
            pq.push(choice);
        }
    }

    if(sum < A){
        impossible();
    }else{
        for(int i = 0; i < K; i++) chose[i]++;
        answer(chose);
    }
}
#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...