Submission #1288228

#TimeUsernameProblemLanguageResultExecution timeMemory
1288228minggaSequence (APIO23_sequence)C++20
50 / 100
2098 ms78696 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]; 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); } }; bool check(int mid, int n) { SEGTREE st(n), pre(n); for(int i = 1; i <= n; i++) { for(int x : pos[i]) { st.update(x, n, 2); } if(sz(pos[i]) >= mid) { for(int j = mid - 1; j < sz(pos[i]); j++) { int r = pos[i][j], l = pos[i][j - mid + 1]; pair<int, int> sus1 = pre.get(0, l - 1), sus2 = pre.get(r, n); pair<int, int> dak1 = st.get(0, l - 1), dak2 = st.get(r, n); int mn1 = sus2.fi - sus1.se; int mx2 = dak2.se - dak1.fi; if(mn1 <= 0 and mx2 >= 0) { return 1; } } } for(int x : pos[i]) { pre.update(x, n, 2); } } return 0; } int sequence(int n, vector<int> a) { for(int i = 0; i < n; i++) { pos[a[i]].pb(i + 1); } int l = 1, r = n; int ans = 1; while(l <= r) { int mid = (l + r) >> 1; if(check(mid, n)) { ans = mid; l = mid + 1; } else r = mid - 1; } 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...