제출 #960077

#제출 시각아이디문제언어결과실행 시간메모리
960077penguin133건물 4 (JOI20_building4)C++17
100 / 100
315 ms147248 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define se second
#define pi pair <int, int> 
#define pii pair <int, pi>

int n, A[1000005], B[1000005], memo[1000005][2], memo2[1000005][2];
int dp1(int x, int f){
	if(x == 2 * n)return !f;
	if(memo[x][f] != -1)return memo[x][f];
	int val = (!f ? A[x] : B[x]);
	int tmp = 1e18;
	if(A[x + 1] >= val)tmp = min(tmp, dp1(x + 1, 0));
	if(B[x + 1] >= val)tmp = min(tmp, dp1(x + 1, 1));
	if(!f)tmp++;
	return memo[x][f] = tmp;
}
int dp2(int x, int f){
	if(x == 2 * n)return !f;
	if(memo2[x][f] != -1)return memo2[x][f];
	int val = (!f ? A[x] : B[x]);
	int tmp = -1e18;
	if(A[x + 1] >= val)tmp = max(tmp, dp2(x + 1, 0));
	if(B[x + 1] >= val)tmp = max(tmp, dp2(x + 1, 1));
	if(!f)tmp++;
	return memo2[x][f] = tmp;
}

void solve(){
	cin >> n;
	for(int i = 1; i <= 2 * n; i++)cin >> A[i];
	for(int i = 1; i <= 2 * n; i++)cin >> B[i];
	memset(memo, -1, sizeof(memo));
	memset(memo2, -1, sizeof(memo2));
	string s;
	int cura = 0, curb = 0, prv = 0;
	for(int i = 1; i <= 2 * n; i++){
		int mn = dp1(i, 0), mx = dp2(i, 0);
		//cerr << mn << ' ' << mx << ' ';
		if(mn <= n - cura && mx >= n - cura && A[i] >= prv){
			s += 'A';
			cura++;
			prv = A[i];
		}
		else{
			mn = dp1(i, 1), mx = dp2(i, 1);
			//cerr << mn << ' ' << mx << ' ';
			if(mn <= n - cura && mx >= n - cura && B[i] >= prv){
				s += 'B';
				curb++;
				prv = B[i];
			}
			else{
				cout << -1 << '\n';
				return;
			}
		}
		//cerr << s << '\n';
	}
	cout << s;
}

main(){
	ios::sync_with_stdio(0);cin.tie(0);
	int tc = 1;
	//cin >> tc;
	while(tc--)solve();
}

컴파일 시 표준 에러 (stderr) 메시지

building4.cpp:65:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   65 | main(){
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...