제출 #630255

#제출 시각아이디문제언어결과실행 시간메모리
630255Arnch건물 4 (JOI20_building4)C++17
100 / 100
592 ms87968 KiB
// oooo
/*
 har chi delet mikhad bebar ~
 gitar o ba khodet nabar! ~
 ;Amoo_Hasan;
*/

#include<bits/stdc++.h>
//#pragma GCC optimize("O3,no-stack-protector,unroll-loops")
//#pragma GCC target("avx2,fma")

using namespace std;

typedef long long ll;
typedef long double ld;

#define Sz(x) int((x).size())
#define All(x) (x).begin(), (x).end()
#define wtf(x) cout<<#x <<" : " <<x <<endl
#define mak make_pair

//constexpr int PRI = 1000696969;
constexpr ll INF = 1e18, N = 1e6 + 10, MOD = 1e9 + 7;

int n;
int a[N], b[N];
int dp[N], ri[N];
bool mark[N], vis[N];
vector<int> vc;


struct node {
	int lz, cnt;
	node() {
		cnt = lz = 0;
	}
} x[N << 2];

void build(int l = 0, int r = 2 * n, int v = 1) {
	if(r - l < 2) {
		if(!mark[l]) {
			if(vc[l] == a[l]) x[v].cnt = -2;
			else x[v].cnt = 2;
		}	
		return;
	}
	int mid = (l + r) >> 1;
	build(l, mid, 2 * v), build(mid, r, 2 * v + 1);
	x[v].cnt = x[2 * v].cnt + x[2 * v + 1].cnt;
}
void put(int l, int r, int v) {
	if(x[v].lz == 0) return;
	x[2 * v].cnt = 0, x[2 * v].lz = 1;
	x[2 * v + 1].cnt = 0, x[2 * v + 1].lz = 1;
	x[v].lz = 0;
}
void change(int s, int e, int l = 0, int r = 2 * n, int v = 1) {
	if(r <= s || l >= e) return;
	if(l >= s && r <= e) {
		x[v].cnt = 0, x[v].lz = 1;
		return;
	}
	put(l, r, v);
	int mid = (l + r) >> 1;
	change(s, e, l, mid, 2 * v), change(s, e, mid, r, 2 * v + 1);
	x[v].cnt = x[2 * v].cnt + x[2 * v + 1].cnt;
}
int get(int s, int e, int l = 0, int r = 2 * n, int v = 1) {
	if(r <= s || l >= e) return 0;
	if(l >= s && r <= e) return x[v].cnt;
	put(l, r, v);
	int mid = (l + r) >> 1;
	return get(s, e, l, mid, 2 * v) + get(s, e, mid, r, 2 * v + 1);
}

int main() {
	ios :: sync_with_stdio(0), cin.tie(0); cout.tie(0);
	
	cin >>n;
	for(int i = 0; i < 2 * n; i++) cin >>a[i];
	for(int i = 0; i < 2 * n; i++) cin >>b[i];

	for(int i = 0; i < 2 * n; i++) {
		if(!vc.empty() && max(a[i], b[i]) < vc.back()) return cout<<-1, 0;

		int val = min(a[i], b[i]);
		if(vc.empty() || vc.back() <= val) vc.push_back(val);
		else vc.push_back(max(a[i], b[i]));
	}

	string s = "";
	for(int j = 0; j < Sz(vc); j++) {
		if(vc[j] == a[j]) s.push_back('A');
		else s.push_back('B');
	}

	int cnt = 0;
	for(int j = 0; j < Sz(vc); j++) {
		if(vc[j] == a[j]) cnt++;
		else cnt--;
	}
	if(cnt == 0) {
		return cout<<s, 0;
	}

	vector<pair<int, pair<int, int> > > nap;
	for(int i = 2 * n - 1; i >= 0; i--) {
		if(vc[i] != min(a[i], b[i])) continue;

		if(i == 2 * n - 1) {
			if(vc[i] == a[i]) dp[i] = -2;
			else dp[i] = 2;
			ri[i] = i;
			
			nap.push_back({dp[i], {i, i}});
			continue;
		}
		if(max(a[i], b[i]) > max(a[i + 1], b[i + 1])) {
			mark[i] = 1;
			continue;
		}
		if(max(a[i], b[i]) <= vc[i + 1]) {
			if(vc[i] == a[i]) dp[i] = -2;
			else dp[i] = 2;
			ri[i] = i;

			nap.push_back({dp[i], {i, i}});
			continue;
		}
		if(mark[i + 1]) {
			mark[i] = 1;
			continue;
		}
		dp[i] = dp[i + 1];
		if(vc[i] == a[i]) dp[i] -= 2;
		else dp[i] += 2;
		ri[i] = ri[i + 1];

		nap.push_back({dp[i], {i, ri[i]}});
	}

	build();
	
	sort(All(nap));
	if(cnt < 0) {
		while(!nap.empty() && cnt < 0) {
			int val = nap.back().first, l = nap.back().second.first, r = nap.back().second.second;
			nap.pop_back();

			val = get(l, r + 1);

			if(val < 0) {
				//return cout<<-1, 0;
				continue;
			}
			if(val + cnt > 0) continue;
			cnt += val;
			change(l, r + 1);
		}
		for(int i = 0; i < 2 * n; i++) {
			if(mark[i]) continue;
			if(get(i, i + 1) == 0) {
				if(s[i] == 'A') s[i] = 'B';
				else s[i] = 'A';
			}
		}
		if(cnt < 0) return cout<<-1, 0;
		return cout<<s, 0;
	}
	reverse(All(nap));
	while(!nap.empty() && cnt > 0) {
		int val = nap.back().first, l = nap.back().second.first, r = nap.back().second.second;
		nap.pop_back();

		val = get(l, r + 1);

		if(val > 0) {
			//return cout<<-1, 0;
			continue;
		}
		if(val + cnt < 0) continue;
		cnt += val;
		change(l, r + 1);
	}
	for(int i = 0; i < 2 * n; i++) {
		if(mark[i]) continue;
		if(get(i, i + 1) == 0) {
			if(s[i] == 'A') s[i] = 'B';
			else s[i] = 'A';
		}
	}
	if(cnt > 0) return cout<<-1, 0;
	return cout<<s, 0;

}


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