제출 #1305251

#제출 시각아이디문제언어결과실행 시간메모리
1305251nekolieFinancial Report (JOI21_financial)C++20
100 / 100
831 ms84276 KiB
#include <bits/stdc++.h> using namespace std; const int baza = (1<<19), M = 300007; map<int,int> mp; set<pair<int,int>> s; int n,k, a[M], dp[M], d[2*baza]; multiset<int> kiki[M]; vector<int> ind[M], take[M]; void akt(int i) { i = (i+baza)/2; while (i > 0) d[i] = max(d[2*i],d[2*i+1]), i >>= 1; } int maks(int l, int r) { l += baza-1, r += baza+1; int w = 0; while (l/2 != r/2) { if ((l&1) == 0) w = max(w,d[l+1]); if ((r&1) == 1) w = max(w,d[r-1]); l >>= 1, r >>= 1; } return w; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> k; for (int i = 0; i < n; i++) cin >> a[i], mp[a[i]] = 0; int cnt = 1; s.insert({0,n-1}); for (auto it = mp.begin(); it != mp.end(); it++) mp[it->first] = cnt++; for (int i = 0; i < n; i++) a[i] = mp[a[i]], ind[a[i]].push_back(i); for (int x = 1; x <= n; x++) { kiki[x].insert(0); for (int i : ind[x]) { if (s.empty() || (*s.rbegin()).second < i) continue; auto it = ((i >= (*s.rbegin()).first) ? prev(s.end()) : prev(s.upper_bound({i,n+1}))); if ((*it).second >= i && i >= (*it).first) { int l = (*it).first, r = (*it).second; s.erase(it); if (i-l >= k) s.insert({l,i-1}); if (r-i >= k) s.insert({i+1,r}); } } for (int i : ind[x]) { if (!s.empty() && (*s.rbegin()).second > i) { int lim = (*s.upper_bound({i,-1})).first+k; take[lim].push_back(i); } } } for (int i = 0; i < n; i++) { for (int j : take[i]) kiki[a[j]].erase(kiki[a[j]].find(dp[j])), d[a[j]+baza] = *kiki[a[j]].rbegin(), akt(a[j]); dp[i] = 1 + maks(0,a[i]-1), kiki[a[i]].insert(dp[i]), d[a[i]+baza] = *kiki[a[i]].rbegin(), akt(a[i]); } cout << *max_element(dp,dp+n) << endl; return 0; }
#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...