제출 #488894

#제출 시각아이디문제언어결과실행 시간메모리
488894CSQ31A Difficult(y) Choice (BOI21_books)C++17
100 / 100
3 ms328 KiB
#include <bits/stdc++.h> #include "books.h" using namespace std; #define pb push_back typedef long long int ll; //bin search for 17 //then take prefix 10 and suffix 10 //in total 38 queries ll a[111111]; ll ask(int x){ if(a[x])return a[x]; else return a[x] = skim(x); } void solve(int n, int k, ll A, int s) { int l = 1,r = n; while(r>=l){ int mid = (l+r)/2; if(ask(mid)<A)l=mid+1; else r=mid-1; } ll sum = 0; for(int i=1;i<=k;i++)sum+=ask(i); vector<int>ans; //take k smallest elements if(sum>2*A)impossible(); else if(sum>=A){ for(int i=1;i<=k;i++)ans.pb(i); answer(ans); return; } //cout<<l<<'\n'; if(l<=n && l>=k){ //take k-1 smallest elements and l if l exists sum = 0; for(int i=1;i<k;i++)sum+=ask(i); sum+=ask(l); if(sum>=A && sum<=2*A){ for(int i=1;i<k;i++)ans.pb(i); ans.pb(l); answer(ans); return; } } l = min(l-1,n); if(l>=k){ for(int i=0;i<=k;i++){ //try all prefix and suffix sum = 0; ans.clear(); for(int j=1;j<=i;j++){ sum+=ask(j); ans.pb(j); } int need = k-i; for(int j=0;j<need;j++){ sum+=ask(l-j); ans.pb(l-j); } if(sum>=A && sum<=2*A){ answer(ans); 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...