結果
| 問題 |
No.1095 Smallest Kadomatsu Subsequence
|
| コンテスト | |
| ユーザー |
platinum
|
| 提出日時 | 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;
}
platinum