제출 #414914

#제출 시각아이디문제언어결과실행 시간메모리
414914Pro_ktmr건물 4 (JOI20_building4)C++17
100 / 100
562 ms90248 KiB
#include"bits/stdc++.h"
using namespace std;
typedef long long ll;
const ll MOD = (ll)(1e9+7);
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define rep(i, n) for(int (i)=0; (i)<(int)(n); (i)++)

const int INF = 1e9;

int N;
int A[1'000'000], B[1'000'000];

// A の数を最大化
int dpA[1'000'000][2];
int solveA(int n, int l){
	if(n == 2*N) return 0;
	if(n == 0) return max(solveA(1, 0)+1, solveA(1, 1));
	
	if(dpA[n][l] != -1) return dpA[n][l];
	int ret = -INF;
	if(l == 0){
		if(A[n-1] <= A[n]) ret = max(ret, solveA(n+1, 0)+1);
		if(A[n-1] <= B[n]) ret =  max(ret,  solveA(n+1, 1));
	}
	else{
		if(B[n-1] <= A[n]) ret = max(ret, solveA(n+1, 0)+1);
		if(B[n-1] <= B[n]) ret = max(ret, solveA(n+1, 1));
	}
	return dpA[n][l] = ret;
}

// B の数を最大化
int dpB[1'000'000][2];
int solveB(int n, int l){
	if(n == 2*N) return 0;
	if(n == 0) return max(solveB(1, 0), solveB(1, 1)+1);
	
	if(dpB[n][l] != -1) return dpB[n][l];
	int ret = -INF;
	if(l == 0){
		if(A[n-1] <= A[n]) ret = max(ret, solveB(n+1, 0));
		if(A[n-1] <= B[n]) ret =  max(ret,  solveB(n+1, 1)+1);
	}
	else{
		if(B[n-1] <= A[n]) ret = max(ret, solveB(n+1, 0));
		if(B[n-1] <= B[n]) ret = max(ret, solveB(n+1, 1)+1);
	}
	return dpB[n][l] = ret;
}

void print(int n, int a, int l){
	if(l == 0) printf("A");
	if(l == 1) printf("B");
	
	if(n == 2*N) return;
	if(n == 0){
		if(solveA(1, 0) >= N-1 && solveB(1, 0) >= N){
			print(n+1, a+1, 0);
			return;
		}
		if(solveA(1, 1) >= N && solveB(1, 1) >= N-1){
			print(n+1, a, 1);
			return;
		}
	}
	
	int b = n-a;
	
	if(l == 0){
		if(A[n-1] <= A[n] && solveA(n+1, 0) >= N-a-1 && solveB(n+1, 0) >= N-b){
			print(n+1, a+1, 0);
			return;
		}
		if(A[n-1] <= B[n] && solveA(n+1, 1) >= N-a && solveB(n+1, 1) >= N-b-1){
			print(n+1, a, 1);
			return;
		}
	}
	else{
		if(B[n-1] <= A[n] && solveA(n+1, 0) >= N-a-1 && solveB(n+1, 0) >= N-b){
			print(n+1, a+1, 0);
			return;
		}
		if(B[n-1] <= B[n] && solveA(n+1, 1) >= N-a && solveB(n+1, 1) >= N-b-1){
			print(n+1, a, 1);
			return;
		}
	}
}

signed main(){
	scanf("%d", &N);
	rep(i, 2*N) scanf("%d", A+i);
	rep(i, 2*N) scanf("%d", B+i);
	
	memset(dpA, -1, sizeof(dpA));
	memset(dpB, -1, sizeof(dpB));
	if(solveA(0, -1) < N || solveB(0, -1) < N){
		printf("-1\n");
		return 0;
	}
	
	print(0, 0, -1);
	printf("\n");
}

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

building4.cpp: In function 'int main()':
building4.cpp:8:27: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    8 | #define rep(i, n) for(int (i)=0; (i)<(int)(n); (i)++)
      |                           ^
building4.cpp:95:2: note: in expansion of macro 'rep'
   95 |  rep(i, 2*N) scanf("%d", A+i);
      |  ^~~
building4.cpp:8:27: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    8 | #define rep(i, n) for(int (i)=0; (i)<(int)(n); (i)++)
      |                           ^
building4.cpp:96:2: note: in expansion of macro 'rep'
   96 |  rep(i, 2*N) scanf("%d", B+i);
      |  ^~~
building4.cpp:94:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   94 |  scanf("%d", &N);
      |  ~~~~~^~~~~~~~~~
building4.cpp:95:19: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   95 |  rep(i, 2*N) scanf("%d", A+i);
      |              ~~~~~^~~~~~~~~~~
building4.cpp:96:19: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   96 |  rep(i, 2*N) scanf("%d", B+i);
      |              ~~~~~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...