Submission #759894

#TimeUsernameProblemLanguageResultExecution timeMemory
759894wenqiArchery (IOI09_archery)C++17
52 / 100
2092 ms8488 KiB
// trans rights
#include <bits/extc++.h>
using namespace std;
#define DIE assert(0);

int N, R;
int Q[400005], S;
int X[400005];

int cons[3];
int splash()
{
	for (int i = 0; i < 3; i++)
		if (cons[i])
			return i;
	DIE
}
int skilled()
{
	memset(cons, 0, sizeof(cons));
	int f = -1;
	deque<pair<int, int>> dq;
	for (int i = 0; i < 2 * N; i++)
		dq.push_back({X[i] + 1, i / 2 + 1});
	for (int r = 1; r <= 3 * N; r++)
	{
		while (r >= dq.front().second)
		{
			cons[dq.front().first]++;
			dq.pop_front();
		}
		int a = splash();
		cons[a]--;
		int b = splash();
		cons[b]--;
		if (a > b)
			swap(a, b);
		dq.push_back({b, N + r});
		cons[a]++;
		if (r >= 2 * N and b == 1)
			f = r;
	}
	assert(f != -1);
	int diff = (R - f + N) % N;
	return N - diff;
}

int cnt[200005][3];
int find_best(int p)
{
	for (int i = 0; i <= 2; i++)
		if (cnt[p][i])
			return i;
	DIE
}
int find_worst(int p)
{
	for (int i = 2; i >= 0; i--)
		if (cnt[p][i])
			return i;
	DIE
}
void zero(int p)
{
	for (int i = 0; i < 3; i++)
		cnt[p][i] = 0;
}
void mov(int i, int j, int (*f)(int))
{
	int h = f(i);
	cnt[i][h]--;
	for (int k = 0; k < 3; k++)
		cnt[j][k] += cnt[i][k];
	zero(i);
	cnt[i][h]++;
}
int washed()
{
	memset(cnt, 0, sizeof(cnt));
	for (int i = 0; i < 2 * N; i++)
		cnt[i / 2 + 1][X[i] + 1]++;
	for (int k = 0; k < 3; k++)
	{
		mov(1, N, find_best);
		for (int i = N; i > 1; i--)
			mov(i, i - 1, find_worst);
	}
	for (int i = 1; i <= N; i++)
	{
		if (cnt[i][1])
			return i;
	}
	DIE
}

void place(int p)
{
	for (int i = 0; i < 2 * p - 1; i++)
		X[i] = Q[i] > S ? 1 : -1;
	X[2 * p - 1] = 0;
	for (int i = 2 * p; i < 2 * N; i++)
		X[i] = Q[i - 1] > S ? 1 : -1;
}

int solve(int (*f)())
{
	pair<int, int> mn = {1e9, 0};
	for (int i = 1; i <= N; i++)
	{
		place(i);
		mn = min(mn, {f(), -i});
	}
	return -mn.second;
}

int main()
{
	ios::sync_with_stdio(0), cin.tie(0);
	cin >> N >> R;
	R = (R - 2 * N) % N + 2 * N;
	cin >> S;
	for (int i = 0; i < 2 * N - 1; i++)
		cin >> Q[i];
	if (S == 1)
	{
		cout << N;
		return 0;
	}
	if (S < N + 2)
	{
		cout << solve(skilled);
		return 0;
	}
	cout << solve(washed);
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...