Submission #1307354

#TimeUsernameProblemLanguageResultExecution timeMemory
1307354mendekeFinancial Report (JOI21_financial)C++20
5 / 100
2504 ms48484 KiB
//#pragma GCC optimize("O3,unroll-loops") //#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #include<bits/stdc++.h> #define ll long long #define F first #define S second #define pb push_back #define pf push_front #define ppb pop_back #define ppf pop_front #define all(x) x.begin(), x.end() const int mod = 1e9 + 7; const int N = 500001; using namespace std; ll n, m, t[N * 4],used[N]; pair <ll, ll> p[N]; vector <ll> v; struct node{ ll l,r,sum,x; }mx[N*4]; node mrg (node a, node b){ node c; c.sum = a.sum + b.sum; c.l = max (a.l, a.sum + b.l); c.r = max (b.r, b.sum + a.r); c.x = max ({a.x,b.x,a.r+b.l}); return c; } void UPD (ll idx, ll val, ll tl = 1, ll tr = n, ll v = 1){ if (tl == tr){ mx[v] = {1,1,1,1}; return; } ll tm = (tl + tr) / 2; if (tm < idx){ UPD (idx, val, tm + 1, tr, v + v + 1); } else{ UPD (idx, val, tl, tm, v + v); } mx[v] = mrg (mx[v + v], mx[v + v + 1]); } node GET (ll l, ll r, ll tl = 1, ll tr = n, ll v = 1){ if (tr < l || tl > r){ return {0,0,0,0}; } if (l <= tl && tr <= r){ return mx[v]; } ll tm = (tl + tr) / 2; return mrg (GET (l, r, tl, tm, v + v), GET (l, r, tm + 1, tr, v + v + 1)); } void upd (ll idx, ll val, ll tl = 1, ll tr = n, ll v = 1){ if (tl == tr){ t[v] = val; return; } ll tm = (tl + tr) / 2; if (tm < idx){ upd (idx, val, tm + 1, tr, v + v + 1); } else{ upd (idx, val, tl, tm, v + v); } t[v] = max (t[v + v], t[v + v + 1]); } ll get (ll l, ll r, ll tl = 1, ll tr = n, ll v = 1){ if (tr < l || tl > r){ return 0; } if (l <= tl && tr <= r){ return t[v]; } ll tm = (tl + tr) / 2; return max (get (l, r, tl, tm, v + v), get (l, r, tm + 1, tr, v + v + 1)); } signed main (){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; for (int i = 1; i <= n; i++){ cin >> p[i].F; p[i].S = i; UPD (i, 1); } sort (p + 1, p + n + 1); p[n + 1].F = -1; ll a = 0, ans = 0; for (int i = 1; i <= n + 1; i++){ if (p[i].F != p[i - 1].F){ sort (all (v)); reverse (all (v)); for (auto j: v){ ll l = 1, r = j - 1, res = j; while (l <= r){ ll md = (l + r) / 2; if (GET (md, j - 1).x >= m){ l = md + 1; } else{ res = md; r = md - 1; } } a = get (res, j) + 1; ans = max (ans, a); upd (j, a); UPD (j, -n); } v.clear(); } v.pb (p[i].S); } cout << ans; }
#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...