Submission #211512

#TimeUsernameProblemLanguageResultExecution timeMemory
211512bensonlzlBuilding 4 (JOI20_building4)C++14
100 / 100
584 ms95572 KiB
#include <bits/stdc++.h>

using namespace std;

typedef pair<int,int> pi;

int N, num[2][1000005];
int fix[1000005];
int curchar[1000005];
int linkend[1000005], linkchange[1000005];
int lowminpref, lowmaxsuff;

vector<pi> chains[1000005];
vector<int> flippos;

void die(){
	cout << -1 << '\n';
	exit(0);
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cin >> N;
	for (int i = 1; i <= 2*N; ++i){
		cin >> num[0][i];
	}
	for (int i = 1; i <= 2*N; ++i){
		cin >> num[1][i];
	}
	num[0][2*N+1] = num[1][2*N+1] = 1e9+10;

	for (int i = 1; i <= 2*N; ++i){
		fix[i] = -1;
	}


	for (int i = 1; i <= 2*N; ++i){
		//cerr << i << '\n';
		if (num[0][i] < lowminpref && num[1][i] < lowminpref){
			die();
		}
		else if (num[0][i] >= lowminpref && num[1][i] < lowminpref){
			fix[i] = 0;
			lowminpref = num[0][i];
		}
		else if (num[0][i] < lowminpref && num[1][i] >= lowminpref){
			fix[i] = 1;
			lowminpref = num[1][i];
		}
		else{
			lowminpref = max(lowminpref,min(num[0][i],num[1][i]));
		}
	}
	lowmaxsuff = 1e9+10;
	for (int i = 2*N; i >= 1; --i){
		//cerr << i << '\n';
		if (num[0][i] > lowmaxsuff && num[1][i] > lowmaxsuff){
			die();
		}
		else if (num[0][i] <= lowmaxsuff && num[1][i] > lowmaxsuff){
			if (fix[i] == 1) die();
			fix[i] = 0;
			lowmaxsuff = num[0][i];
		}
		else if (num[0][i] > lowmaxsuff && num[1][i] <= lowmaxsuff){
			if (fix[i] == 0) die();
			fix[i] = 1;
			lowmaxsuff = num[1][i];
		}
		else{
			if (fix[i] != -1) lowmaxsuff = min(lowmaxsuff,num[fix[i]][i]);
			else lowmaxsuff = min(lowmaxsuff,max(num[0][i],num[1][i]));
		}
	}
	int as = 0;
	for (int i = 1; i <= 2*N; ++i){
		if (fix[i] != -1) curchar[i] = fix[i];
		else{
			if (num[0][i] <= num[1][i]) curchar[i] = 0;
			else curchar[i] = 1;
		}
		if (curchar[i] == 0) as++;
	}
	for (int i = 2*N; i >= 1; --i){
		if (fix[i] == -1){
			linkend[i] = i;
			linkchange[i] = (curchar[i] == 0 ? -1 : 1);
			if (num[1-curchar[i]][i] > num[curchar[i+1]][i+1]){
				linkend[i] = linkend[i+1];
				linkchange[i] += linkchange[i+1];
			}
			chains[linkend[i]].push_back(pi(linkchange[i],i));
		}
	}
	for (int i = 1; i <= 2*N; ++i){
		chains[i].push_back(pi(0,1e9));
		sort(chains[i].begin(),chains[i].end());
	}
	if (as < N){
		for (int i = 1; i <= 2*N; ++i){
			reverse(chains[i].begin(),chains[i].end());
		}
		
	}
	//cerr << as << '\n';
	int diff = 0;
	for (int i = 1; i <= 2*N; ++i){
		if (as + diff == N) break;
		if (chains[i].size()){
			if (as < N){
				if (as + diff + chains[i][0].first >= N){
					for (auto it : chains[i]){
						if (as + diff + it.first == N){
							flippos.push_back(it.second);
							diff += it.first;
							break;
						}
					}
				}
				else{
					diff += chains[i][0].first;
					flippos.push_back(chains[i][0].second);
				}
			}
			else if (as > N){
				if (as + diff + chains[i][0].first <= N){
					for (auto it : chains[i]){
						if (as + diff + it.first == N){
							flippos.push_back(it.second);
							diff += it.first;
							break;
						}
					}
				}
				else{
					diff += chains[i][0].first;
					flippos.push_back(chains[i][0].second);
				}
			}
			
		}
	}
	//cerr << as << '\n';
	if (as + diff != N) die();
	for (auto it : flippos){
		if (it == 1e9) continue;
		int x = it;
		while (x != linkend[x]){
			curchar[x] = 1 - curchar[x];
			x++;
		}
		curchar[x] = 1 - curchar[x];
	}
	for (int i = 1; i <= 2*N; ++i){
		if (curchar[i] == 0) cout << 'A';
		else cout << 'B';
	}
	cout << '\n';
}


/*
3
2 5 4 9 15 11
6 7 6 8 12 14


2
1 4 10 20
3 5 8 13


2
3 4 5 6
10 9 8 7


6
25 18 40 37 29 95 41 53 39 69 61 90
14 18 22 28 18 30 32 32 63 58 71 78

6
14 18 22 28 18 30 32 32 63 58 71 78
25 18 40 37 29 95 41 53 39 69 61 90

BABBABAABABA
ABAABABBABAB

*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...