Submission #1213067

#TimeUsernameProblemLanguageResultExecution timeMemory
1213067emptypringlescanBuilding 4 (JOI20_building4)C++17
100 / 100
164 ms36788 KiB
#include <bits/stdc++.h>
using namespace std;
long long arr[1000005],brr[1000005];
pair<int,int> can[2][1000005];
int32_t main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n;
	cin >> n;
	for(int i=1; i<=2*n; i++) cin >> arr[i];
	for(int i=1; i<=2*n; i++) cin >> brr[i];
	can[0][0]={0,0}; can[1][0]={0,0};
	for(int i=1; i<=2*n; i++){
		can[0][i]={1e9,-1};
		if(arr[i]>=arr[i-1]){
			can[0][i].first=min(can[0][i].first,can[0][i-1].first+1);
			can[0][i].second=max(can[0][i].second,can[0][i-1].second+1);
		}
		if(arr[i]>=brr[i-1]){
			can[0][i].first=min(can[0][i].first,can[1][i-1].first+1);
			can[0][i].second=max(can[0][i].second,can[1][i-1].second+1);
		}
		can[1][i]={1e9,-1};
		if(brr[i]>=arr[i-1]){
			can[1][i].first=min(can[1][i].first,can[0][i-1].first);
			can[1][i].second=max(can[1][i].second,can[0][i-1].second);
		}
		if(brr[i]>=brr[i-1]){
			can[1][i].first=min(can[1][i].first,can[1][i-1].first);
			can[1][i].second=max(can[1][i].second,can[1][i-1].second);
		}
		//assert(!(can[0][i].second<can[1][i].first-1||can[0][i].first>can[1][i].second+1));
		//cout << can[0][i].first << ' ' << can[0][i].second << "   " << can[1][i].first << ' ' << can[1][i].second << '\n';
	}
	if((can[0][2*n].first>n||can[0][2*n].second<n)&&(can[1][2*n].first>n||can[1][2*n].second<n)){
		cout << -1;
		return 0;
	}
	int cur=n,val=1e9;
	vector<int> ans;
	for(int i=2*n; i>0; i--){
		if(arr[i]<=val&&can[0][i].first<=cur&&can[0][i].second>=cur){
			cur--;
			val=arr[i];
			ans.push_back(0);
		}
		else{
			val=brr[i];
			ans.push_back(1);
		}
	}
	reverse(ans.begin(),ans.end());
	for(int i:ans) cout << (i?'B':'A');
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...