제출 #943038

#제출 시각아이디문제언어결과실행 시간메모리
943038salmonA Difficult(y) Choice (BOI21_books)C++14
65 / 100
2 ms1444 KiB
#include <bits/stdc++.h>
#include "books.h"

using namespace std;

void solve(int N, int K, long long A, int S) {
    long long int lst[100100];
    long long int sum = 0;

    for(int i = 1; i <= N; i++){
        lst[i] = -1;
    }

    for(int i = 1; i <= K; i++){
        lst[i] = skim(i);
        sum += lst[i];
    }

    if(sum >= A * 2){
        impossible();
    }
    else if(sum >= A){
        vector<int> v;

        for(int i = 1; i <= K; i++){
            v.push_back(i);
        }

        answer(v);
    }
    else{
        vector<int> v;

        int s = 1;
        int e = N + 1;

        while(s != e){
            int m = (s + e) / 2;

            long long int v;

            if(lst[m] != -1) v = lst[m];
            else v = skim(m);
            lst[m] = v;

            if(v >= A){
                e = m;
            }
            else{
                s = m + 1;
            }
        }

        if(s < K){
            impossible();
            return;
        }

        if(s != N + 1){
            long long int tomp;
            if(lst[s] == -1) tomp = skim(s);
            else tomp = lst[s];

            lst[s] = tomp;

            if(sum - lst[K] + tomp <= A * 2){
                for(int i = 1; i <= K - 1; i++){
                    v.push_back(i);
                }
                v.push_back(s);
                answer(v);
                return;
            }
            N = s - 1;
        }

        set<int> sat;

        for(int i = 1; i <= K; i++){
            sat.insert(i);
        }

        for(int i = 0; i < K; i++){
            sat.erase(K - i);
            sat.insert(N - i);

            long long int vo;

            if(lst[N - i] != -1) vo = lst[N - i];
            else vo = skim(N - i);
            lst[N - i] = vo;

            sum -= lst[K - i];
            sum += vo;

            if(A <= sum && sum <= A * 2){
                for(int i : sat){
                    v.push_back(i);
                }
                answer(v);
                return;
            }
        }
        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...