제출 #1368210

#제출 시각아이디문제언어결과실행 시간메모리
1368210SofiatpcA Difficult(y) Choice (BOI21_books)C++20
60 / 100
1 ms1180 KiB
#include <bits/stdc++.h>

#include "books.h"

using namespace std;

typedef long long ll;
const int MAXN = 1e5+5;
ll val[MAXN];

void solve(int n, int k, ll a, int s) {
    for(int i = 1; i <= n; i++)val[i] = 0;

    int e = 1, d = n;
    while(e != d){
        int mid = (e+d)/2;
        if(val[mid] == 0)val[mid] = skim(mid);

        if(val[mid] <= a)e = mid+1;
        else d = mid;
    }

    ll mn = 0;
    for(int i = 1; i <= k; i++){
        if(val[i] == 0)val[i] = skim(i);
        mn += val[i];
    }

    if(mn > 2*a){ impossible(); return; }

    if(a < val[e] && val[e] <= 2*a && val[e]+mn-val[k] <= 2*a && k <= e){
        vector<int> ans;
        for(int i = 1; i < k; i++)ans.push_back(i);
        ans.push_back(e);

        answer(ans);
        return;
    }

    int lim = (val[e] > a)? e-1 : e;

    if(lim < k){ impossible(); return; }

    int cur = k, lst = lim;
    while(cur > 0 && mn < a){
        if(val[lst] == 0)val[lst] = skim(lst);
        mn += val[lst]-val[cur];
        cur--; lst--;
    }

    if(mn < a){ impossible(); return; }

    vector<int> ans;
    for(int i = 1; i <= cur; i++)ans.push_back(i);
    for(int i = lst+1; i <= lim; i++)ans.push_back(i);

    answer(ans);

}

#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…