結果

問題 No.1095 Smallest Kadomatsu Subsequence
ユーザー platinumplatinum
提出日時 2020-05-25 01:29:42
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 95 ms / 2,000 ms
コード長 1,409 bytes
コンパイル時間 1,811 ms
コンパイル使用メモリ 171,956 KB
実行使用メモリ 6,528 KB
最終ジャッジ日時 2024-11-22 15:43:46
合計ジャッジ時間 3,860 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 2 ms
5,248 KB
testcase_02 AC 2 ms
5,248 KB
testcase_03 AC 2 ms
5,248 KB
testcase_04 AC 2 ms
5,248 KB
testcase_05 AC 2 ms
5,248 KB
testcase_06 AC 2 ms
5,248 KB
testcase_07 AC 2 ms
5,248 KB
testcase_08 AC 2 ms
5,248 KB
testcase_09 AC 2 ms
5,248 KB
testcase_10 AC 2 ms
5,248 KB
testcase_11 AC 2 ms
5,248 KB
testcase_12 AC 2 ms
5,248 KB
testcase_13 AC 5 ms
5,248 KB
testcase_14 AC 6 ms
5,248 KB
testcase_15 AC 6 ms
5,248 KB
testcase_16 AC 6 ms
5,248 KB
testcase_17 AC 6 ms
5,248 KB
testcase_18 AC 6 ms
5,248 KB
testcase_19 AC 5 ms
5,248 KB
testcase_20 AC 5 ms
5,248 KB
testcase_21 AC 6 ms
5,248 KB
testcase_22 AC 5 ms
5,248 KB
testcase_23 AC 95 ms
6,400 KB
testcase_24 AC 94 ms
6,400 KB
testcase_25 AC 94 ms
6,528 KB
testcase_26 AC 94 ms
6,400 KB
testcase_27 AC 94 ms
6,400 KB
testcase_28 AC 82 ms
6,400 KB
testcase_29 AC 82 ms
6,400 KB
testcase_30 AC 86 ms
6,400 KB
testcase_31 AC 87 ms
6,528 KB
testcase_32 AC 87 ms
6,400 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function 'int main()':
main.cpp:53:17: warning: 'm_pos' may be used uninitialized [-Wmaybe-uninitialized]
   53 |                 if(i < m_pos){
      |                 ^~
main.cpp:22:20: note: 'm_pos' was declared here
   22 |         int m=INF, m_pos;
      |                    ^~~~~

ソースコード

diff #

#include <bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(int)(n); i++)

using namespace std;
const int Max_N=2e5, Max_A=1e8;
const int INF=1e9;

int main(){
	int N;
	cin >> N;
	assert(N>=3 && N<=Max_N);
	vector<int> A(N), test(N);
	rep(i,N){
		int a;
		cin >> a;
		assert(a>=1 && a<=Max_A);
		A[i]=a, test[i]=a;
	}
	sort(test.begin(),test.end());
	rep(i,N-1) assert(test[i] != test[i+1]);
	//最小値を探す
	int m=INF, m_pos;
	rep(i,N){
		if(A[i] < m){
			m=A[i];
			m_pos=i;
		}
	}
	//左からi番目までの最小値
	vector<int> min_left(N);
	int ML=INF;
	rep(i,N){
		ML=min(ML,A[i]);
		min_left[i]=ML;
	}
	//右からi番目までの最小値
	vector<int> min_right(N);
	int MR=INF;
	rep(i,N){
		MR=min(MR,A[N-1-i]);
		min_right[N-1-i]=MR;
	}
	int ans=INF;
	//最小値が真ん中のケース
	if(m_pos >= 1 && m_pos < N-1){
		ans=min_left[m_pos-1]+m+min_right[m_pos+1];
	}
	//最小値が左右のケース、真ん中全探索
	int res=INF;
	for(int i=1; i<N-1; i++){
		if(i == m_pos) continue;
		//最小値が一番右
		if(i < m_pos){
			int left=min_left[i-1];
			if(left > A[i]) continue;
			int size=left+A[i]+m;
			res=min(res,size);
		}
		//最小値が一番左
		if(i > m_pos){
			int right=min_right[i+1];
			if(right > A[i]) continue;
			int size=m+A[i]+right;
			res=min(res,size);
		}
	}
	ans=min(ans,res);
	if(ans==INF) cout << -1 << endl;
	else cout << ans << endl;

	return 0;
}
0