結果
問題 | No.1095 Smallest Kadomatsu Subsequence |
ユーザー |
![]() |
提出日時 | 2020-05-25 01:29:42 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.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 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 30 |
コンパイルメッセージ
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;}