제출 #1150704

#제출 시각아이디문제언어결과실행 시간메모리
1150704LudisseyA Difficult(y) Choice (BOI21_books)C++20
100 / 100
19 ms416 KiB
#include <bits/stdc++.h>
#include "books.h"
#define int long long
#define sz(a) (int)a.size()
#define all(a) a.begin(), a.end()
 
using namespace std;

map<int,int> mp;
int ski(int x){
    if(mp.find(x)!=mp.end()) return mp[x];
    return mp[x]=skim((int)(x+1));
}


void solve(signed N, signed K, long long A, signed S) {
    vector<pair<int,int>> a;
    set<int> st;
    for (int i = 0; i < K; i++) {
        a.push_back({ski(i),i});
        st.insert(i);
    }
    int l=K, r=N-1;
    while(l<r){
        int mid=(l+r)/2;
        int v=ski(mid);
        if(v>=A) {
            r=mid;
        }else{
            l=mid+1;
        }
    }
    int mxI=r;
    for (int i = mxI; i >= max(0LL, (mxI-K)); i--)
    {
        if(st.find(i)!=st.end()) continue;
        a.push_back({ski(i),i});
    }
    sort(all(a));
    vector<int> mask(K, 1);
    mask.resize(sz(a), 0);
    vector<signed> ans;
    do {
        int sum=0;
        for (int i = 0; i < sz(a); i++) {
            if (mask[i]) sum+=a[i].first;
        }
        if(sum>=A&&sum<=2*A){
            for (int i = 0; i < sz(a); i++) {
                 if (mask[i]) ans.push_back(a[i].second+1);
            }
            answer(ans);
            return;
        }
    } while (prev_permutation(mask.begin(), mask.end()));
    impossible();
    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...