제출 #941555

#제출 시각아이디문제언어결과실행 시간메모리
941555XiaoyangA Difficult(y) Choice (BOI21_books)C++17
0 / 100
2 ms600 KiB
#include "books.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; #define fi first #define se second #define pll pair<ll,ll> #define pb push_back #define debug(x) cerr<<#x<<"="<<x<<endl; #define MP make_pair #define rep(i,a,b) for(ll i=a;i<b;i++) #define SZ(x) (ll)x.size() #define ALL(x) x.begin(),x.end() #define endl "\n" const ll inf=1e18; const ll maxn=1e5+5; ll diff[maxn]; ll d(ll x){ if(diff[x])return diff[x]; return diff[x]=skim(x); } void solve(int n, int k, long long A, int s) { ll sum=0; vector<int>ans; rep(i,1,n+1){ sum+=d(i); if(i<=k)ans.pb(i); } if(sum>2*A)impossible(); if(sum>=A)answer(ans); return; // the sum of the first k elements is def lesser than A //if >=A and <=2A we would have alr answered //if >2A its def impossible //if we find the largest index of element that is lesser than A //we can switch any element to it and still be <=2A ll lo=1,hi=n; while(lo<hi){ ll mid=(lo+hi)>>1; if(d(mid)<=A)lo=mid; else hi=mid-1; } if(sum-d(k)+d(lo)>=A){ ans[k-1]=lo; answer(ans); } int idx=1; while(idx<=k and lo>0){ ans[idx-1]=lo; sum-=d(idx);idx++; sum+=d(lo);lo--; } if(sum>=A)answer(ans); 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...