結果
問題 | No.1095 Smallest Kadomatsu Subsequence |
ユーザー | heno239 |
提出日時 | 2020-06-26 21:34:18 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 237 ms / 2,000 ms |
コード長 | 2,444 bytes |
コンパイル時間 | 1,505 ms |
コンパイル使用メモリ | 124,328 KB |
実行使用メモリ | 8,316 KB |
最終ジャッジ日時 | 2024-07-04 19:52:13 |
合計ジャッジ時間 | 4,673 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 30 |
ソースコード
#include<iostream> #include<string> #include<cstdio> #include<vector> #include<cmath> #include<algorithm> #include<functional> #include<iomanip> #include<queue> #include<ciso646> #include<random> #include<map> #include<set> #include<bitset> #include<stack> #include<unordered_map> #include<utility> #include<cassert> #include<complex> #include<numeric> using namespace std; //#define int long long typedef long long ll; typedef unsigned long long ul; typedef unsigned int ui; constexpr ll mod = 998244353; const ll INF = mod * mod; typedef pair<int, int>P; #define stop char nyaa;cin>>nyaa; #define rep(i,n) for(int i=0;i<n;i++) #define per(i,n) for(int i=n-1;i>=0;i--) #define Rep(i,sta,n) for(int i=sta;i<n;i++) #define rep1(i,n) for(int i=1;i<=n;i++) #define per1(i,n) for(int i=n;i>=1;i--) #define Rep1(i,sta,n) for(int i=sta;i<=n;i++) #define all(v) (v).begin(),(v).end() typedef pair<ll, ll> LP; typedef long double ld; typedef pair<ld, ld> LDP; const ld eps = 1e-8; const ld pi = acosl(-1.0); struct SegT { private: int sz; vector<int> node; const int init_c = mod; public: SegT(int n) { sz = 1; while (sz < n)sz *= 2; node.resize(2 * sz - 1, init_c); } int f(int a, int b) { return min(a, b); } void update(int k, int a) { k += sz - 1; node[k] = a; while (k > 0) { k = (k - 1) / 2; node[k] = f(node[k * 2 + 1], node[k * 2 + 2]); } } int query(int a, int b, int k = 0, int l = 0, int r = -1) { if (r < 0)r = sz; if (r <= a || b <= l)return init_c; else if (a <= l && r <= b)return node[k]; else { int vl = query(a, b, k * 2 + 1, l, (l + r) / 2); int vr = query(a, b, k * 2 + 2, (l + r) / 2, r); return f(vl, vr); } } }; void solve() { int n; cin >> n; vector<int> a(n); rep(i, n)cin >> a[i]; SegT st(n); int ans = mod; vector<P> vs; rep(i, n)vs.push_back({ a[i],i }); sort(all(vs)); rep(i, n) { int id = vs[i].second; int le = st.query(0, id); int ri = st.query(id + 1, n); ans = min(ans, le + ri + a[id]); st.update(id, a[id]); } rep(i, n)st.update(i, mod); per(i, n) { int id = vs[i].second; int le = st.query(0, id); int ri = st.query(id + 1, n); ans = min(ans, le + ri + a[id]); st.update(id, a[id]); } if (ans >= mod)ans = -1; cout << ans << "\n"; } signed main() { ios::sync_with_stdio(false); cin.tie(0); //cout << fixed << setprecision(7); //init_f(); //init(); //int t; cin >> t; rep(i, t) solve(); stop return 0; }