Submission #570465

#TimeUsernameProblemLanguageResultExecution timeMemory
570465jiahngA Difficult(y) Choice (BOI21_books)C++14
45 / 100
28 ms1032 KiB
#include <bits/stdc++.h>

using namespace std;

#include "books.h"

typedef long long ll;
typedef pair<ll, ll> pi;
typedef vector <int> vi;
typedef vector <pi> vpi;
typedef pair<pi, ll> pii;
typedef set <ll> si;
typedef long double ld;
#define f first
#define s second
#define mp make_pair
#define FOR(i,s,e) for(int i=s;i<=int(e);++i)
#define DEC(i,s,e) for(int i=s;i>=int(e);--i)
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define lbd(x, y) lower_bound(all(x), y)
#define ubd(x, y) upper_bound(all(x), y)
#define aFOR(i,x) for (auto i: x)
#define mem(x,i) memset(x,i,sizeof x)
#define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define maxn 100010
#define INF (ll)1e18
#define MOD 998244353
typedef pair <vi, int> pvi;
typedef pair <int,pi> ipi;
//~ //
// --- Sample implementation for the task books ---
//
// To compile this program with the sample grader, place:
//     books.h books_sample.cpp sample_grader.cpp
// in a single folder and run:
//     g++ books_sample.cpp sample_grader.cpp
// in this folder.
//

ll memo[maxn];
ll qry(int x){
	if (memo[x] != -1) return memo[x];
	return memo[x] = skim(x);
}
void solve(int N, int K, long long A, int S) {
	mem(memo, -1);
	int l = 0, r = N + 1;
	while (l + 1 < r){
		int m = (l + r) / 2;
		if (qry(m) > A) r = m;
		else l = m;
	}
	int x = r;
	ll sm1 = 0, sm2 = 0;
	FOR(i,1,K) sm1 = min(INF, sm1 + qry(i));
	if (x <= K){
		if (A <= sm1 && sm1 <= 2 * A){
			vi ans;
			FOR(i,1,K) ans.pb(i);
			answer(ans);
		}else impossible();
		return;
	}
	FOR(i,x-K,x-1) sm2 = min(INF, sm2 + qry(i));
    ll sm3 = 0;
    FOR(i,1,K-1) sm3 = min(INF, sm3 + qry(i));
    // if there is an element > A
    if (x <= N && A <= qry(x) + sm3 && qry(x) + sm3 <= 2 * A){
		vi ans;
		FOR(i,1,K-1) ans.pb(i);
		ans.pb(x);
		answer(ans); return;
	}
	if (sm1 > 2 * A || sm2 < A){
		impossible(); return;
	}
	
	if (sm1 >= A){
		vi ans;
		FOR(i,1,K) ans.pb(i);
		answer(ans); return;
	}
	if (sm2 <= 2 * A){
		vi ans;
		FOR(i,x-K,x-1) ans.pb(i);
		answer(ans); return;
	}
	
	vi v, idx;
	// can create from elements in [1,K] and [x-K,x-1]
	FOR(i,1,N) if (i <= K || (i >= x - K && i <= x - 1)){
		v.pb(qry(i)); idx.pb(i);
	}
	
	FOR(bm,0,(1<<(v.size()+1))-1) if (__builtin_popcount(bm) == K){
		ll sm = 0;
		FOR(i,0,v.size()-1) if (bm & (1 << i)) sm = min(INF, sm + v[i]);
		if (A <= sm && sm <= 2 * A){
			vi ans;
			FOR(i,0,v.size()-1) if (bm & (1 << i)) ans.pb(idx[i]);
			answer(ans);
			return;
		}
	}
	//~ assert(0);
	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...