제출 #1354173

#제출 시각아이디문제언어결과실행 시간메모리
1354173nataliaaA Difficult(y) Choice (BOI21_books)C++20
100 / 100
0 ms412 KiB

#include <bits/stdc++.h>
#include "books.h"
using namespace std;
void solve(int n, int k, long long a, int Q) {
    int l = 1, r = n;
    vector<int> ans;
    int es = n+1;
    while(l<=r){
        int m = (l+r)/2;
        long long ok = skim(m);
        if(ok>a) {r = m-1; es = m;}
        else if(ok<a) {l = m+1;}
        else {
            es= m;
            break;
        }
    }
    //cout << es <<endl;
    vector<pair<long long,int>> v;
    long long s = 0;
    for(int i = 1; i<= k; i++) {
        long long x = skim(i);
        s+=x;
        v.push_back({x, i});
    }
    if(s>2*a) {impossible(); return;}
    int q = es-k;
    q = max(1, q);
    if(es-k<=k) q = k+1;
    for(int i = q; i< es; i++){
        long long x = skim(i);
        v.push_back({x, i});
    } 

    long long sum1 = s - v[k-1].first;
    if(es!=n+1) sum1+=skim(es);
    if(sum1>=a&&sum1<=2*a&&es!=n+1){
        for(int i = 1; i< k; i++) ans.push_back(i);
        ans.push_back(es);
        answer(ans);
        return;
    }
    //cout << s << endl;
    int m = (int)v.size();
    r = k-1, l = 0;
    while(r<m-1){
        if(s>=a&&s<=2*a){
            for(int i = l; i<=r; i++) ans.push_back(v[i].second);
            answer(ans); return;
        }
        
        s-=v[l].first;
        r++;
        l++;
        s+=v[r].first;
    }
    if(s>=a&&s<=2*a){
        for(int i = l; i<=r; i++) ans.push_back(v[i].second);
        answer(ans); return;
    }
    impossible();
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…