제출 #383846

#제출 시각아이디문제언어결과실행 시간메모리
383846ec1117건물 4 (JOI20_building4)C++17
11 / 100
788 ms524292 KiB
#include "bits/stdc++.h"
using namespace std;

#define mp make_pair
#define f first
#define s second
#define FOR(i,a,b) for(int i=a;i<b;i++)
#define For(i,b) FOR(i,0,b)
#define trav(a,b) for(auto& a:b)
#define vi vector<int>
#define vpi vector<pi>
#define pb push_back
#define bk back()
#define ins insert
#define pi pair<int,int>
#define ll long long
#define sz(x) (int) x.size()
#define all(x) x.begin(),x.end()
#define nl '\n'

const int MX=1e6+10;
const int MX2=4e6+10;
int n,a[MX][2];
vector<vector<vi>> dp[MX];//hold val of hm A left
vector<vector<vpi>> dp2[MX];//hold val of hm A left
//dp[i][j][k][l]

// void dbg(){
// 	cerr<<endl;
// }
// template<class A,class... B> dbg(A a, B... b){
// 	cerr<<a;
// 	if(sizeof...(b))cerr<<", ";
// 	dbg(b...);
// }

struct DivC{
	void go(int x,int l, int r){
		dp[x]=vector<vector<vi>>(r-l+2,vector<vi>(2,vi(2,-1)));
		dp2[x]=vector<vector<vpi>>(r-l+2,vector<vpi>(2,vpi(2,{-1,-1})));
		if(l==r){
			dp[x][1][0][0]=1;
			dp[x][0][1][1]=0;
			return;
		}
		if(l!=r){
			int m=(l+r)/2;
			go(x*2,l,m);
			go(x*2+1,m+1,r);
			For(i,r-l+2){//16nlog
				For(t1,2)For(t2,2){
					For(t3,2)For(t4,2){
						For(k,i+1){  
							if(k<sz(dp[x*2]) && i-k<sz(dp[x*2+1])){
								if(a[m][t3]<=a[m+1][t4]){
									if(dp[x*2][k][t1][t3]!=-1 && dp[x*2+1][i-k][t4][t2]!=-1){
										dp[x][i][t1][t2]=k;
										dp2[x][i][t1][t2]={t3,t4};
										break;
									}
								}
							}
						}
					}
				}
			}
		}
	}
};

DivC dc;
string ret;

void go2(int x, int as, int l, int r){
	if(sz(dp[x])==2){
		ret+=(as?"A":"B");
	} else {
		int num=dp[x][as][l][r];
		int t1=dp2[x][as][l][r].f;
		int t2=dp2[x][as][l][r].s;
		go2(x*2,num,l,t1);
		go2(x*2+1,as-num,t2,r);
	}
}

int main(){
	cin.tie(0)->sync_with_stdio(0);
	cin>>n;
	For(i,2*n)cin>>a[i][0];
	For(i,2*n)cin>>a[i][1];
	dc.go(1,0,2*n-1);
	For(i,2)For(j,2){
		// cout<<i<<" "<<j<<" "<<dp[1][n][i][j]<<nl;
		if(dp[1][n][i][j]!=-1){
			go2(1,n,i,j);
			cout<<ret<<nl;
			return 0;
		}
	}
	cout<<-1<<nl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...