제출 #543002

#제출 시각아이디문제언어결과실행 시간메모리
543002MarcosPauloEversBuilding 4 (JOI20_building4)C++17
100 / 100
318 ms45504 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e6 + 10, INF = 0x3f3f3f3f;
int n;
int arr[2][MAXN], dp[2][MAXN][2];

int main()
{
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	cin >> n;
	for(int i = 0; i < (n<<1); i++) cin >> arr[0][i];
	for(int i = 0; i < (n<<1); i++) cin >> arr[1][i];

	for(int i = 0; i < (n<<1) - 1; i++)
	{
		bool flag = false;
		for(auto& k: {0, 1})
			if(arr[k][i] <= arr[k][i+1] ||
				arr[k][i] <= arr[k^1][i+1])
				flag = true;

		if(!flag)
			return cout << -1 << "\n", 0;
	}
	
	for(auto& k: {0, 1})
		dp[k][n << 1][0] = dp[k][n << 1][1] = 0;
	for(int i = (n<<1) - 1; i >= 1; i--)
		for(int f: {0, 1})
		{
			dp[0][i][f] = arr[1][i] >= arr[f][i-1] ? dp[0][i+1][1] : INF;

			if(arr[0][i] >= arr[f][i - 1]) 
				dp[0][i][f] = min(dp[0][i][f], 1 + dp[0][i+1][0]);
		}

	for(int i = (n<<1) - 1; i >= 1; i--)
		for(int f: {0, 1})
		{
			dp[1][i][f] = arr[1][i] >= arr[f][i-1] ? dp[1][i+1][1] : -INF;

			if(arr[0][i] >= arr[f][i - 1] && dp[1][i+1][0] != -INF) 
				dp[1][i][f] = max(dp[1][i][f], dp[1][i+1][0]+1);
		}
	
	string ans = "";
	int cnt = n, last = 0;
	for(int i = 0; i < (n<<1); i++)
	{
		if(arr[0][i] >= last &&
			dp[0][i+1][0] <= cnt-1 &&
			dp[1][i+1][0] >= cnt-1 && cnt > 0)
			ans += "A", last = arr[0][i], cnt--;
		else if(dp[0][i+1][1] <= cnt &&
				dp[1][i+1][1] >= cnt && arr[1][i] >= last)
			ans += "B", last = arr[1][i];
		else
			return cout << -1 << "\n", 0;
	}
	cout << ans << "\n";
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...