Submission #414756

#TimeUsernameProblemLanguageResultExecution timeMemory
414756amunduzbaevA Difficult(y) Choice (BOI21_books)C++14
0 / 100
17 ms308 KiB
#include "books.h"
#include <bits/stdc++.h>
#ifndef EVAL
#include "grader.cpp"
#endif
using namespace std;

#define int long long
#define i32 int32_t
#define pb push_back
#define ff first
#define ss second

template<class T> bool umin(T& a, const T b) { if(a > b) { a = b; return 1; } return 0; }
template<class T> bool umax(T& a, const T b) { if(a < b) { a = b; return 1; } return 0; }

const int M = 2e5+5;
const long long inf = 1e18;
int a[M], pref[M];

void solve(i32 n, i32 k, int A, i32 s) {
	if(s < n) { impossible(); return; }
	
	for(i32 i=1;i<=n;i++) a[i] = skim(i);
	for(int i=1;i<=n;i++) pref[i] = pref[i-1] + a[i];
	int res = inf, l = -1, r = -1;
	for(int i=k;i<=n;i++){
		if(pref[i] - pref[i-k] >= A && umin(res, pref[i] - pref[i-k])) l = i-k+1, r = i;
	} if(l == -1) { impossible(); return; }
	set<pair<int, int>> ss;
	for(int i=l;i<=r;i++) ss.insert({a[i], i});
	for(int i=l-1;i>=0;i--){
		if(res <= 2*A) continue;
		int bad = -1;
		for(auto x : ss){
			if(res - x.ff + a[i] < A) break;
			bad = i;
		} if(~bad) ss.erase({a[bad], bad}), ss.insert({a[i], i}), res = res - a[bad] + a[i];
	} if(res >= A && res <= 2*A){
		vector<i32> rr;
		for(auto x : ss) rr.pb(x.ss);
		answer(rr);
	} else impossible();
	return;
}

/*

4 2 10 5
5 10 17 25

*/
#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...