Submission #1015569

#TimeUsernameProblemLanguageResultExecution timeMemory
1015569ByeWorldBuilding 4 (JOI20_building4)C++14
100 / 100
213 ms101452 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3", "unroll-loops")
#define ll long long
#define int long long
#define pb push_back
#define fi first
#define se second
#define lf (id<<1)
#define rg ((id<<1)|1)
#define md ((l+r)>>1)
#define ld long double
using namespace std;
typedef pair<int,int> pii;
typedef pair<pii, int> ipii;
const int MAXN = 2e6+20;
const int MAXA = 9e3+20;
const ll INF = 1e18+10;
const int LOG = 19;
const int MOD = 1e9+7;
const int SQRT = 450;
const vector<int> NOL = {};
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const vector<int> dx = {1, -1, 0, 0};
const vector<int> dy = {0, 0, 1, -1};
void chmx(int &a, int b){
	a = max(a, b);
}
int n;
int a[MAXN], b[MAXN], c[MAXN], d[MAXN];
int x[MAXN], y[MAXN];

int idx = -1;
void cek(int xx){
	if((a[xx]<=0 && 0<=b[xx]) || (c[xx]<=0 && 0<=d[xx])) idx = xx;
}
void solve(int i, int la, int ty){
	if(x[la] <= x[i]){
		if(a[la]!=-INF && c[la]!=INF){
			a[i] = a[la]+ty; b[i] = d[la]+ty;
		} else if(a[la]!=-INF){
			a[i] = a[la]+ty; b[i] = b[la]+ty;
		} else if(c[la]!=INF){
			a[i] = c[la]+ty; b[i] = d[la]+ty;
		}
	}
}
void solve2(int i, int lb, int ty){
	if(x[lb] <= x[i]){
		// cout << i << " ikena\n";
		if(a[lb]!=-INF && c[lb]!=INF){
			c[i] = a[lb]+ty; d[i] = d[lb]+ty;
		} else if(a[lb]!=-INF){
			c[i] = a[lb]+ty; d[i] = b[lb]+ty;
		} else if(c[lb]!=INF){
			c[i] = c[lb]+ty; d[i] = d[lb]+ty;
		}
	}
}
signed main(){
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin >> n; n *= 2;
	for(int i=1; i<=2*n; i+=2) cin >> x[i];
	for(int i=2; i<=2*n; i+=2) cin >> x[i];
	for(int i=1; i<=2*n; i++){
		a[i] = -INF; b[i] = -INF; c[i] = INF; d[i] = INF;
	}
	{
		a[1] = b[1] = -1;
		c[2] = d[2] = 1;
	}
	for(int i=3; i<=2*n; i++){
		int la = i-2, lb=i-1, ty = -1;
		if(i%2==0){
			// bawah +1
			la--; lb--;
			ty = 1;
		}
		// la
		solve(i, la, ty);
		// lb
		solve2(i, lb, ty);
		if(a[i]<=c[i]&&d[i]<=b[i]){
			c[i] = d[i] = INF;
		}
		if(c[i]<=a[i]&&b[i]<=d[i]){
			a[i] = b[i] = -INF;
		}
		// cout << i << "i\n";
		// cout << a[i] << ' ' << b[i] << ' ' << c[i] << ' ' << d[i] << " xx\n";
		
		if(b[i]!=-INF && c[i]!=INF) c[i] = b[i]+2;
		
		// cout << a[i] << ' ' << b[i] << ' ' << c[i] << ' ' << d[i] << " xx\n";
	} 
	cek(2*n-1); cek(2*n);
	if(idx==-1){ cout << "-1\n"; exit(0); }

	string ans = "";
	int nw = idx, val = 0;
	// cout << idx << " idx\n";
	while(1<=nw){
		ans += (nw%2 ? 'A' : 'B');
		int te = (nw%2 ? 1 : -1);

		if(a[nw]<=val && val<=b[nw]){
			if(nw%2==0) nw--;
			nw -= 2;
			val += te;
		} else {
			if(nw%2==0) nw--;
			nw--;
			val += te;
		}
	}
	reverse(ans.begin(), ans.end());
	cout << ans << '\n';
}
/*
2
3 4 5 6
10 9 8 7
3
2 5 4 9 15 11
6 7 6 8 12 14

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
BABBABAABABA
// 19 aneh
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...