제출 #1288245

#제출 시각아이디문제언어결과실행 시간메모리
1288245mingga서열 (APIO23_sequence)C++20
0 / 100
1345 ms86736 KiB
#include "bits/stdc++.h" using namespace std; #define ln "\n" #define pb push_back #define fi first #define se second #define all(x) (x).begin(), (x).end() #define sz(x) ((int)(x).size()) #define ll long long const int mod = 1e9 + 7; const int inf = 2e9; const int N = 5e5 + 7; vector<int> pos[N]; vector<pair<int, int>> ev[N]; struct SEGTREE { vector<pair<int, int>> st; vector<int> lazy; int n; SEGTREE(int n) : n(n) { st.resize(n * 4 + 4, {0, 0}); lazy.resize(n * 4 + 4, 0); init(); } pair<int, int> merge(pair<int, int> X, pair<int, int> Y) { return make_pair(min(X.fi, Y.fi), max(X.se, Y.se)); } void build(int i, int l, int r) { if(l == r) { st[i] = {-l, -l}; return; } int m = (l + r) >> 1; build(i * 2, l, m); build(i * 2 + 1, m + 1, r); st[i] = merge(st[i * 2], st[i * 2 + 1]); } void push(int i) { if(lazy[i]) { int x = lazy[i]; lazy[i] = 0; for(int j = 2 * i; j <= 2 * i + 1; j++) { st[j].fi += x, st[j].se += x; lazy[j] += x; } } } void update(int i, int l, int r, int u, int v, int x) { if(l > v or r < u) return; if(u <= l and r <= v) { st[i].fi += x; st[i].se += x; lazy[i] += x; return; } int m = (l + r) >> 1; push(i); update(i * 2, l, m, u, v, x); update(i * 2 + 1, m + 1, r, u, v, x); st[i] = merge(st[i * 2], st[i * 2 + 1]); } pair<int, int> get(int i, int l, int r, int u, int v) { if(l > v or r < u) return {inf, -inf}; if(u <= l and r <= v) return st[i]; int m = (l + r) >> 1; push(i); return merge(get(i * 2, l, m, u, v), get(i * 2 + 1, m + 1, r, u, v)); } void init() { build(1, 0, n); } void update(int l, int r, int x) { update(1, 0, n, l, r, x); } pair<int, int> get(int l, int r) { return get(1, 0, n, l, r); } }; struct SEGTREE1 { vector<int> st; int n; SEGTREE1(int n) : n(n) { st.resize(n * 4 + 4, n + 1); } void update(int i, int l, int r, int u, int x) { if(l == r) { st[i] = min(st[i], x); return; } int m = (l + r) >> 1; if(u <= m) update(i * 2, l, m, u, x); else update(i * 2 + 1, m + 1, r, u, x); st[i] = min(st[i * 2], st[i * 2 + 1]); } int get(int i, int l, int r, int u, int v) { if(l > v or r < u) return n + 1; if(u <= l and r <= v) return st[i]; int m = (l + r) >> 1; return min(get(i * 2, l, m, u, v), get(i * 2 + 1, m + 1, r, u, v)); } void update(int u, int x) { update(1, 1, n, u, x); } int get(int l, int r) { return get(1, 1, n, l, r); } }; int sequence(int n, vector<int> a) { for(int i = 0; i < n; i++) { pos[a[i]].pb(i + 1); } int ans = 1; SEGTREE st(n), pre(n); for(int i = 1; i <= n; i++) { for(int x : pos[i]) { st.update(x, n, 2); } deque<pair<int, int>> d; vector<int> cmp, cmp1; for(int j = 0; j < sz(pos[i]); j++) { int r = pos[i][j]; int cur_mx = st.get(r, n).se; int cur_mn = pre.get(r, n).fi; int pre_mx = pre.get(0, r).se; int pre_mn = st.get(0, r).fi; cmp1.pb(cur_mx), cmp.pb(cur_mn), cmp.pb(pre_mx), cmp1.pb(pre_mn); // if(i == 1) { // cerr << "UDP " << pre_mn << ' ' << pre_mx << ' ' << j + 1 << ln; // cerr << "GET " << cur_mx << ' ' << cur_mn << ' ' << j + 1 << ln; // } } sort(all(cmp)); cmp.erase(unique(all(cmp)), cmp.end()); sort(all(cmp1)); cmp1.erase(unique(all(cmp1)), cmp1.end()); for(int j = 0; j < sz(pos[i]); j++) { int r = pos[i][j]; int cur_mx = upper_bound(all(cmp1), st.get(r, n).se) - cmp1.begin(); int cur_mn = upper_bound(all(cmp), pre.get(r, n).fi) - cmp.begin(); int pre_mx = upper_bound(all(cmp), pre.get(0, r - 1).se) - cmp.begin(); int pre_mn = upper_bound(all(cmp1), st.get(0, r - 1).fi) - cmp1.begin(); ev[pre_mn].pb({pre_mx, j + 1}); ev[cur_mx].pb({cur_mn, -j - 1}); } SEGTREE1 sus(sz(cmp)); for(int j = 1; j <= sz(cmp1); j++) { for(auto x : ev[i]) { if(x.se > 0) { sus.update(x.fi, x.se); } else { int pre = sus.get(x.fi, sz(cmp)); if(pre <= -x.se) ans = max(ans, -x.se - pre + 1); } } ev[i].clear(); } for(int x : pos[i]) { pre.update(x, n, 2); } } return ans; } // signed main() { // cin.tie(0) -> sync_with_stdio(0); // int n; cin >> n; // vector<int> a; // for(int i = 1; i <= n; i++) { // int x; cin >> x; // a.pb(x); // } // cout << sequence(n, a) << ln; // }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...