Submission #863729

#TimeUsernameProblemLanguageResultExecution timeMemory
863729TAhmed33A Difficult(y) Choice (BOI21_books)C++17
60 / 100
1 ms856 KiB
#include <bits/stdc++.h>
#include <books.h>
using namespace std;
typedef long long ll;
void solve (int n, int k, ll a, int s) {
	map <int, ll> dd;
	int l = 1, r = n - k + 1;
	int ans = -1;
	while (l <= r) {
		int mid = (l + r) >> 1;
		ll sum = 0;
		for (int i = mid; i <= mid + k - 1; i++) {
			if (!dd.count(i)) {
				dd[i] = skim(i);
			}
			sum += dd[i];
		}
		if (sum >= a) {
			r = mid - 1; ans = mid;
		} else {
			l = mid + 1;
		}
	}
    if (ans != -1) {
    	ll t = 0;
    	for (int i = ans; i <= ans + k - 1; i++) t += dd[i];
        if (t <= 2 * a) {
        	vector <int> ret;
        	for (int i = ans; i <= ans + k - 1; i++) ret.push_back(i);
        	answer(ret);
        }
    }
    ll sum = 0;
    for (int i = 1; i < k; i++) {
        if (!dd.count(i)) dd[i] = skim(i);
        sum += dd[i];
    }
    l = k; r = n;
    ans = -1;
    while (l <= r) {
        int mid = (l + r) >> 1;
        if (!dd.count(mid)) dd[mid] = skim(mid);
        if (dd[mid] > a) {
            r = mid - 1; ans = mid;
        } else {
            l = mid + 1;
        }
    }
    if (ans != -1) {
        if (sum + dd[ans] >= a && sum + dd[ans] <= 2 * a) {
            vector <int> ret;
            for (int i = 1; i < k; i++) ret.push_back(i);
            ret.push_back(ans);
            answer(ret);
        }
    }
    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...