제출 #218724

#제출 시각아이디문제언어결과실행 시간메모리
218724Andrei_CotorBuilding 4 (JOI20_building4)C++11
100 / 100
448 ms37240 KiB
//alt: la dinamica de n^2 se observa ca pozitiile cu 1 sunt consecutive
#include<iostream>
#include<fstream>
#include<algorithm>
#include<stdlib.h>

using namespace std;

int A[2][1000005];
bool Mand[1000005];
int Rez[1000005];
int Chain[1000005];

void imposs()
{
	cout<<"-1\n";
	exit(0);
}

void markMandatory(int poz, int val)
{
	if(Mand[poz]==1 && Rez[poz]!=val)
		imposs();
	else if(Mand[poz])
		return;

	while(poz>=1)
	{
		Mand[poz]=1;
		Rez[poz]=val;

		if(Mand[poz-1])
		{
			if(A[Rez[poz-1]][poz-1]>A[val][poz])
				imposs();
			break;
		}

		int nr=0;
		int newval=-1;
		if(A[0][poz-1]<=A[val][poz])
		{
			nr++;
			newval=0;
		}

		if(A[1][poz-1]<=A[val][poz])
		{
			nr++;
			newval=1;
		}

		if(nr==2)
			break;

		if(newval==-1)
			imposs();

		val=newval;
		poz--;
	}
}

int getval(int poz)
{
	if(Mand[poz])
		return A[Rez[poz]][poz];
	return min(A[0][poz],A[1][poz]);
}

void flip(int st, int dr)
{
	for(int i=st; i<=dr; i++)
		Rez[i]=1-Rez[i];
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	//ifstream fi("data.in");
	int n;
	cin>>n;

	for(int i=1; i<=2*n; i++)
		cin>>A[0][i];

	for(int i=1; i<=2*n; i++)
		cin>>A[1][i];

	for(int i=1; i<=2*n; i++)
	{
		if(A[0][i]<=A[1][i])
		{
			if(getval(i-1)>A[0][i])
				markMandatory(i,1);

			if(i!=2*n && A[1][i]>max(A[0][i+1],A[1][i+1]))
				markMandatory(i,0);
		}
		else
		{ 
			if(getval(i-1)>A[1][i])
				markMandatory(i,0);

			if(i!=2*n && A[0][i]>max(A[0][i+1],A[1][i+1]))
				markMandatory(i,1);
		}
	}

	int nra=0;
	for(int i=1; i<=2*n; i++)
	{
		if(!Mand[i])
		{
			if(A[0][i]<=A[1][i])
				Rez[i]=0;
			else
				Rez[i]=1;
		}

		nra+=(Rez[i]==0);
	}

	bool sw=0;
	if(nra<n)
	{
		sw=1;
		for(int i=1; i<=2*n; i++)
		{
			swap(A[0][i],A[1][i]);
			Rez[i]=1-Rez[i];
		}
		nra=2*n-nra;
	}

	//convertesc unele A-uri in B, avand grija sa nu obtin conflicte
	for(int i=1; i<=2*n; i++)
	{
		if(Mand[i])
			continue;

		if(!Mand[i-1] && A[1-Rez[i-1]][i-1]>A[Rez[i]][i]) //cand ii dau flip lui i-1 trb sa-i dau si lui i
			Chain[i]=Chain[i-1];
		else
			Chain[i]=i;
	}

	int cnt=0;
	int dr=2*n;
	for(int i=2*n; i>=1; i--)
	{
		if(Mand[i])
			continue;

		if(Chain[i]!=Chain[i+1])
		{
			dr=i;
			cnt=0;
		}

		if(Rez[i]==0)
			cnt--;
		else
			cnt++;

		if(cnt<0 && nra+cnt>=n)
		{
			nra+=cnt;
			flip(i,dr);
			dr=i-1;
			cnt=0;
		}
	}

	if(nra>n)
		imposs();

	for(int i=1; i<=2*n; i++)
	{
		if(A[Rez[i-1]][i-1]>A[Rez[i]][i])
			imposs();
	}

	for(int i=1; i<=2*n; i++)
	{
		if(sw)
			Rez[i]=1-Rez[i];

		if(!Rez[i])
			cout<<"A";
		else
			cout<<"B";
	}
	cout<<"\n";
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...