Untitled
unknown
c_cpp
6 months ago
1.6 kB
5
Indexable
#include <bits/stdc++.h> using namespace std; #define int long long struct SegTree{ int op(int a,int b){ return max(a , b); } vector<int> T; int n; SegTree(int _n){ n = _n; T.resize(2 * n); } void build(vector<int> &a){ for(int i = 0; i < n; i++){ update(i , a[i]); } } void update(int pos,int val){ for(T[pos += n] = val; pos ; pos>>=1){ T[pos >> 1] = op(T[pos],T[pos ^ 1]); } } int query(int l,int r){ int ans = 0; for(l += n, r += n+1; l<r; l >>= 1, r >>= 1){ if(l%2){ ans = op(ans, T[l++]); } if(r%2){ ans = op(ans, T[--r]); } } return ans; } }; void solve() { int n; cin >> n; vector<int> a(n); for(int i = 0; i < n; i++) { cin >> a[i]; } vector<int> pref(n), suff(n); pref[0] = 1; suff[n - 1] = 1; for(int i = 1; i < n; i++) { if(a[i - 1] <a[i]) { pref[i] = pref[i - 1] + 1; } else { pref[i] = 1; } } SegTree st(n + 10); for(int i = n - 2; i >= 0; i--) { if(a[i] < a[i + 1]) { suff[i] = suff[i + 1] + 1; } else { suff[i] = 1; } st.update(a[i], suff[i]); } int ans = 1; for(int i = 0; i < n; i++) { ans = max(ans, pref[i] + st.query(a[i] + 1, n)); st.update(a[i], 0); } cout << ans << '\n'; } int32_t main() { ios::sync_with_stdio(false); cin.tie(0); int tt = 1; // cin >> tt; while(tt--) solve(); }
Editor is loading...
Leave a Comment