Submission #941546

#TimeUsernameProblemLanguageResultExecution timeMemory
941546XiaoyangA Difficult(y) Choice (BOI21_books)C++17
5 / 100
6 ms856 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) {
    // TODO implement this function
    if(s==n and n<=1000 and k==3){
		rep(i,1,n+1){
			diff[i]=skim(i);
		}
		diff[n+1]=inf;
		rep(i,1,n-1){
			rep(j,i+1,n){
				ll sum=diff[i]+diff[j];
				ll id=lower_bound(diff+j+1,diff+n+1,A-sum)-diff;
				if(id==n+1 or diff[i]+diff[j]+diff[id]>2*A)break;
				else{
					vector<int>ans;
					ans.pb(i);
					ans.pb(j);
					ans.pb(id);
					answer(ans);
					return;
				}
			}
		}
		impossible();
	}
	
	int lo=1,hi=n;
	while(lo<hi){
		ll mid=(lo+hi)>>1;
		if(d(mid)<(A+k-1)/k)lo=mid+1;
		else hi=mid;
	}

	if(lo+k>n){
		ll tmp=0;
		ll loo=lo-(n-k);
		vector<int>ans;
		rep(i,loo,loo+k){
			tmp+=d(i);
			ans.pb(i);
		}
		if(tmp>=A)answer(ans);
		else impossible();
	}
	vector<int>ans;
	rep(i,lo,min(lo+k,n+1))ans.pb(i);
	answer(ans);
}
#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...