結果
問題 | No.1095 Smallest Kadomatsu Subsequence |
ユーザー | platinum |
提出日時 | 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; | ^~~~~
ソースコード
#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; }