結果

問題 No.1095 Smallest Kadomatsu Subsequence
ユーザー BapliscaBaplisca
提出日時 2020-06-28 17:09:17
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 2,711 bytes
コンパイル時間 2,277 ms
コンパイル使用メモリ 206,824 KB
実行使用メモリ 29,708 KB
最終ジャッジ日時 2023-09-22 04:30:48
合計ジャッジ時間 5,979 ms
ジャッジサーバーID
(参考情報)
judge14 / judge11
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,380 KB
testcase_01 AC 2 ms
4,376 KB
testcase_02 AC 1 ms
4,376 KB
testcase_03 AC 2 ms
4,380 KB
testcase_04 WA -
testcase_05 AC 2 ms
4,380 KB
testcase_06 AC 2 ms
4,376 KB
testcase_07 AC 2 ms
4,376 KB
testcase_08 WA -
testcase_09 AC 2 ms
4,380 KB
testcase_10 WA -
testcase_11 AC 2 ms
4,376 KB
testcase_12 WA -
testcase_13 AC 9 ms
4,832 KB
testcase_14 AC 10 ms
4,912 KB
testcase_15 WA -
testcase_16 AC 9 ms
4,772 KB
testcase_17 WA -
testcase_18 AC 9 ms
4,648 KB
testcase_19 WA -
testcase_20 WA -
testcase_21 WA -
testcase_22 AC 9 ms
4,680 KB
testcase_23 AC 253 ms
29,708 KB
testcase_24 AC 249 ms
29,656 KB
testcase_25 AC 250 ms
29,636 KB
testcase_26 WA -
testcase_27 WA -
testcase_28 AC 196 ms
29,640 KB
testcase_29 AC 199 ms
29,644 KB
testcase_30 AC 220 ms
29,664 KB
testcase_31 AC 222 ms
29,640 KB
testcase_32 AC 220 ms
29,692 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;

//#define int long long
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
#define rep(i,n) for(int i=0;i<n;++i)
#define rep1(i,n) for(int i=1;i<n;++i)
#define exrep(i, a, b) for(ll i = a; i < b; i++)
#define out(x) cout << x << endl
#define EPS (1e-7)
#define gearup ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);

typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef vector<char> vc;
typedef vector<bool> vb;
typedef vector<double> vd;
typedef vector<string> vs;
typedef vector<pair<int,int> > vpii;
typedef vector<vector<int> > vvi;
typedef vector<vector<char> > vvc;
typedef vector<vector<bool> > vvb;
typedef vector<vector<double> > vvd;
typedef vector<vector<string> > vvs;
typedef vector<ll> vl;
typedef vector<vector<ll> > vvl;
typedef vector<vector<vector<ll> > > vvvl;
ll MOD = 1000000007;
const long long L_INF = 1LL << 60;
const int INF = 2147483647; // 2^31-1
const double PI = acos(-1);
//cout<<fixed<<setprecision(10);

template<class T> inline bool chmin(T& a, T b) {if (a > b) {a = b;return true;}return false;}
template<class T> inline bool chmax(T& a, T b) {if (a < b) {a = b;return true;}return false;}
template<class T> void debug(T v){rep(i,v.size()) cout<<v[i]<<" ";cout<<endl;}
const ll dx[8] = {1, 1, 0, -1, -1, -1, 0, 1};
const ll dy[8] = {0, 1, 1, 1, 0, -1, -1, -1};
//以降 cin の入力元が 'input.txt' になる
//std::ifstream in("input.txt");
//std::cin.rdbuf(in.rdbuf());

signed main()
{   
    gearup;
    ll n; cin >> n;
    vl a(n);
    rep(i,n)cin>>a[i];
    vl sl_mi(n+1,L_INF),sr_mi(n+1,L_INF);

    rep(i,n)sl_mi[i+1] = min(sl_mi[i],a[i]);
    for(int i=n-1;i>=0;i--)sr_mi[i] = min(sr_mi[i+1],a[i]);

    ll res = L_INF;
    //Bを固定する Bが大きい場合
    for(int i=1;i<n-1;i++){
        ll B = a[i];
        ll A = sl_mi[i];
        ll C = sr_mi[i+1];
        if(A < B && B > C)res = min(res,A+B+C);
    }

    //Bが小さい場合
    vl dp_l(n);
    set<ll> l;
    rep(i,n){
        auto itr = l.upper_bound(a[i]);
        if(itr == l.end())dp_l[i] = L_INF;
        else dp_l[i] = *itr;
        l.insert(a[i]);
    }
    vl dp_r(n);
    set<ll> r;
    for(int i=n-1;i>=0;i--){
        auto itr = r.upper_bound(a[i]);
        if(itr == r.end())dp_r[i] = L_INF;
        else dp_r[i] = *itr;
        r.insert(a[i]);
    }
    ll res1 = L_INF;
    //Bを固定する Bが小さい場合
    for(int i=1;i<n-1;i++){
        ll B = a[i];
        ll A = dp_l[i-1];
        ll C = dp_r[i+1];
        if(A > B && B < C)res1 = min(res,A+B+C);
    }
    res = min(res,res1);
    if(res == L_INF)out(-1);
    else out(res);
}
0