Submission #1304609

#TimeUsernameProblemLanguageResultExecution timeMemory
1304609vlomaczkA Difficult(y) Choice (BOI21_books)C++20
0 / 100
2 ms656 KiB
#include <bits/stdc++.h>
#include "books.h"
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
typedef long long ll;
using namespace __gnu_pbds;
using namespace std;

template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

void solve(int N, int K, ll A, int S) {
	int lo=1, hi=N;
	vector<int> a(N+1);
	if(skim(N) >= A) {
		while(lo < hi) {
			int mid = (lo+hi)/2;
			if(skim(mid) < A) lo = mid + 1;
			else hi = mid;
		}
		a[lo] = skim(lo);
	} else lo = N+1;
	if(lo < K) impossible();
	for(int i=1; i<=K; ++i) a[i] = skim(i);
	for(int i=lo-1; i>=lo-K; --i) a[i] = skim(i);
	if(lo <= N) {
		ll suma = a[lo];
		for(int i=1; i<K; ++i) suma += a[i];
		if(suma <= 2*A) {
			vector<int> ans = {lo};
			for(int i=1; i<K; ++i) ans.push_back(i);
			answer(ans);
		}
	}
	vector<pair<int, int>> vals;
	for(int i=1; i<=K; ++i) vals.push_back({a[i], i});
	for(int i=max(K+1, lo-K); i<lo; ++i) vals.push_back({a[i], i});
	ll suma = 0;
	vector<int> ans;
	for(int i=0; i<K; ++i) {
		ans.push_back(vals[i].second);
		suma += vals[i].first;
	}
	if(A<=suma && suma<=2*A) answer(ans);
	for(int i=K; i<vals.size(); ++i) {
		suma -= vals[i-K].first;
		suma += vals[K].first;
		reverse(ans.begin(), ans.end());
		ans.pop_back();
		reverse(ans.begin(), ans.end());
		ans.push_back(vals[i].second);
		if(A<=suma && suma<=2*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...