제출 #652353

#제출 시각아이디문제언어결과실행 시간메모리
652353ymmA Difficult(y) Choice (BOI21_books)C++17
0 / 100
1 ms312 KiB
#include "books.h"
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x)
typedef long long ll;
typedef std::pair<int, int> pii;
typedef std::pair<ll , ll > pll;
using namespace std;

int bin(int n, int k, ll a)
{
	int l=0, r=n-k+1;
	while (l < r) {
		int m = (l+r)/2;
		if (skim(m+1)*k >= a)
			r = m;
		else
			l = m+1;
	}
	return l;
}

const int N = 1e5+10;
int x[N];

void solve(int n, int k, long long a, int s)
{
	int i = bin(n, k, a);
	if (i == n-k+1) {
		impossible();
		return;
	}
	ll sum = 0;
	Loop (j,i,i+k) {
		x[j] = skim(j+1);
		sum += x[j];
	}
	if (sum <= 2*a) {
		vector<int> ans(k);
		iota(ans.begin(), ans.end(), i+1);
		answer(ans);
		return;
	}
	int fail = -1;
	for (int j = i-1; j >= 0; --j) {
		x[j] = skim(j+1);
		sum += x[j];
		sum -= x[j+k];
		if (sum < a) {
			fail = j;
			break;
		}
		if (sum <= 2*a) {
			vector<int> ans(k);
			iota(ans.begin(), ans.end(), i+1);
			answer(ans);
			return;
		}
	}
	if (fail == -1) {
		impossible();
		return;
	}
	i = fail+k;
	assert(x[i] >= a);
	sum = x[i];
	Loop (j,0,k-1)
		sum += skim(j+1);
	if (sum <= 2*a) {
		vector<int> ans(k);
		iota(ans.begin(), ans.end(), 1);
		ans[k-1] = i+1;
		answer(ans);
		return;
	} else {
		impossible();
		return;
	}
}
#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...