Submission #374858

#TimeUsernameProblemLanguageResultExecution timeMemory
374858peijarXylophone (JOI18_xylophone)C++17
0 / 100
3 ms1132 KiB
#include "xylophone.h"
#include <bits/stdc++.h>
#define int long long
using namespace std;

static int A[5001];
static bool isLess[5001][5001];
static int queries[5001][5001];

// On a |a[i+1] - a[i]|, |a[i+2] - a[i+1]|, max(...)

// a[i] < a[i+2] < a[i+1] : z = x
// a[i+1] < a[i+2] < a[i] : z = x

// 
// a[i+1] < a[i] < a[i+2] : z = y
// a[i+2] < a[i] < a[i+1] : z = y

// a[i+2] < a[i+1] < a[i] : z > x,y
// a[i] < a[i+1] < a[i+2] : z > x,y

void solve(signed N) 
{
	isLess[1][2] = true;
	for (int i(1); i < N; ++i)
		queries[i][i+1] = query(i,i+1);
	for (int i(1); i < N-1; ++i)
		queries[i][i+2] = query(i, i+2);
	for (int i(1); i+2 <= N; ++i)
	{
		int x(queries[i][i+1]), y(queries[i+1][i+2]), z(queries[i][i+2]);
		if (x == z)
		{
			if (isLess[i][i+1])
				isLess[i][i+2] = true, isLess[i+2][i+1] = true;
			else
				isLess[i+2][i] = true, isLess[i+1][i+2] = true;
		}
		else if (z == y)
		{
			if (isLess[i][i+1])
				isLess[i+2][i] = isLess[i+2][i+1] = true;
			else
				isLess[i+1][i+2] = isLess[i][i+2] = true;
		}
		else
		{
			if (isLess[i][i+1])
				isLess[i][i+2] = isLess[i+1][i+2] = true;
			else
				isLess[i+2][i+1] = isLess[i+2][i] = true;
		}
	}
	cerr << "HEY"<<endl;
	for (int flip(0); flip < 2; ++flip)
		for (int posMin(1); posMin <= N; ++posMin)
		{
			vector<bool> seen(N+1, false);
			A[posMin] = 1;
			for (int i(posMin-1); i; --i)
			{
				if (isLess[i][i+1] ^ flip)
					A[i] = A[i+1] - queries[i][i+1];
				else
					A[i] = A[i+1] + queries[i][i+1];
			}
			for (int i(posMin+1); i <= N; ++i)
			{
				if (isLess[i-1][i] ^ flip)
					A[i] = A[i-1] + queries[i-1][i];
					else
						A[i] = A[i-1] - queries[i-1][i];
			}
			bool ok(true);
			for (int i(1); ok and i <= N; ++i)
			{
				if (A[i] < 1 or A[i] > N or seen[A[i]])
					ok = false;
				else
					seen[A[i]] = true;
			}
			if (ok)
			{
				for (int i(1); i <= N; ++i)
					answer(i, A[i]);
				return ;
			}
		}
	assert(false);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...