제출 #71687

#제출 시각아이디문제언어결과실행 시간메모리
71687jibu11Xylophone (JOI18_xylophone)C++14
100 / 100
93 ms840 KiB
#include "xylophone.h"
#include <stdio.h>
//static int A[5000];
int lis[5010], vis[5010];

int bs(int in, int fin, int vl)
{
	if(in >= fin)
		return in;
	int med = (in+fin)/2;
	if(query(1,med) == vl)
		return bs(in, med, vl);
	return bs(med+1, fin, vl);
}

int abs(int a)
{
	return (a > 0) ? a : (-a);
}

void coisoetal(int pos, int dir, int n)
{
	int i;
	for(i = pos+2*dir; i <= n && i >= 1; i+=dir)
	{
		int a2;
		if(dir > 0)
			a2 = query(i-dir, i);
		else
			a2 = query(i, i-dir);
		if(lis[i-dir]+a2 > n || vis[lis[i-dir]+a2])
		{
			lis[i] = lis[i-dir]-a2;
			vis[lis[i]] = 1;
		}
		else if(lis[i-dir]-a2 < 1 || vis[lis[i-dir]-a2])
		{
			lis[i] = lis[i-dir]+a2;
			vis[lis[i]] = 1;
		}
		else
		{
			int a3;
			if(dir > 0)
				a3 = query(i-2*dir, i);
			else
				a3 = query(i, i-2*dir);
			if(a3 == abs(lis[i-dir]-lis[i-2*dir]))
			{
				if(lis[i-dir] > lis[i-2*dir])
				{
					lis[i] = lis[i-dir]-a2;
					vis[lis[i]] = 1;
				}
				else
				{
					lis[i] = lis[i-dir]+a2;
					vis[lis[i]] = 1;
				}
			}
			else if(a2 == a3)
			{
				if(lis[i-dir] > lis[i-2*dir])
				{
					lis[i] = lis[i-dir]-a2;
					vis[lis[i]] = 1;
				}
				else
				{
					lis[i] = lis[i-dir]+a2;
					vis[lis[i]] = 1;
				}
			}
			else
			{
				if(a3+lis[i-2*dir] == lis[i-dir]+a2)
				{
					lis[i] = a3+lis[i-2*dir];
					vis[lis[i]] = 1;
				}
				else
				{
					lis[i] = lis[i-2*dir]-a3;
					vis[lis[i]] = 1;
				}
			}
		}
	}
}

void solve(int n) {
	int pos = bs(1,n, n-1);
	vis[n] = 1;
	lis[pos] = n;
	if(pos != n)
	{
		int a1 = query(pos, pos+1);
		lis[pos+1] = n-a1;
		vis[n-a1] = 1;
	}
	
	int a1 = query(pos-1, pos);
	lis[pos-1] = n-a1;
	vis[n-a1] = 1;
	coisoetal(pos, 1, n);
	coisoetal(pos, -1, n);
	int i;
	for(i = 1; i <= n; i++)
	{
		//printf("%d %d\n", i, lis[i]);
		answer(i, lis[i]);
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...