Submission #1201677

#TimeUsernameProblemLanguageResultExecution timeMemory
1201677IBoryA Difficult(y) Choice (BOI21_books)C++20
100 / 100
1 ms1188 KiB
#include <bits/stdc++.h>
#include "books.h"
typedef long long ll;
using namespace std;

const int MAX = 100007;
ll X[MAX];

ll Skim(int p) {
	if (X[p]) return X[p];
	return X[p] = skim(p);
}

void solve(int N, int K, ll A, int S) {
	memset(X, 0, 8 * (N + 1));

	ll base = 0;
	for (int i = 1; i < K; ++i) base += Skim(i);

	int L = K, R = N + 1;
	while (L + 1 < R) {
		int mid = (L + R) >> 1;
		(A * 2 < base + Skim(mid) ? R : L) = mid;
	}

	vector<int> ans(K);
	iota(ans.begin(), ans.end(), 1);
	if (A * 2 < base + Skim(L)) impossible();
	if (A <= base + skim(L)) {
		ans[K - 1] = L;
		answer(ans);
		return;
	}

	base += Skim(K);
	for (int i = K; i > 0; --i) {
		int r = L - (K - i);
		base += Skim(r) - Skim(i);
		ans[i - 1] = r;
		if (A <= base && base <= A * 2) {
			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...