Submission #421131

#TimeUsernameProblemLanguageResultExecution timeMemory
421131MamedovFinancial Report (JOI21_financial)C++17
5 / 100
325 ms13972 KiB
#include <bits/stdc++.h> #define pii pair<int, int> #define piii pair<int, pii> #define pb push_back #define ll long long #define pll pair<ll, ll> #define ui unsigned int #define ull unsigned long long #define f first #define s second #define oo 1000000000 using namespace std; const int up = 3e5 + 5; int tree[up << 2]; void update(int node, int l, int r, int pos, int val) { if(l == r) { tree[node] = val; }else { int mid = (l + r) >> 1; if(pos <= mid) { update(node << 1, l, mid, pos, val); }else { update((node << 1) | 1, mid + 1, r, pos, val); } tree[node] = max(tree[node << 1], tree[(node << 1) | 1]); } } int Max(int node, int l, int r, int ql, int qr) { if(ql > qr || l > qr || ql > r) return 0; if(ql <= l && r <= qr) { return tree[node]; }else { int mid = (l + r) >> 1; return max(Max(node << 1, l, mid, ql, qr), Max((node << 1) | 1, mid + 1, r, ql, qr)); } } bool cmp(pii p1, pii p2) { if(p1.f == p2.f) return p1.s > p2.s; else return p1.f < p2.f; } void solve() { int n, d; cin >> n >> d; vector<pii>a(n); vector<int>dp(n, 1); for(int i = 0; i < n; ++i) { cin >> a[i].f; a[i].s = i; } sort(a.begin(), a.end()); set<pii>ranges; vector<int>to_left(n); for(int i = 0; i < n; ++i) { int idx = a[i].s; to_left[idx] = max(0, idx - d); pii cur = {idx, idx + d}; auto itr = ranges.upper_bound(cur); if(itr != ranges.begin()) { --itr; if(itr->f <= idx && itr->s >= idx) { cur.f = itr->f; cur.s = max(cur.s, itr->s); ranges.erase(itr); itr = ranges.upper_bound(cur); if(itr != ranges.end() && itr->f <= cur.s) { cur.s = max(cur.s, itr->s); ranges.erase(itr); } } }else if(itr != ranges.end() && itr->f <= cur.s) { cur.s = max(cur.s, itr->s); ranges.erase(itr); } to_left[idx] = cur.f; ranges.insert(cur); } sort(a.begin(), a.end(), cmp); int res = 0; for(int i = 0; i < n; ++i) { int idx = a[i].s; dp[idx] = Max(1, 0, n - 1, to_left[idx], idx - 1) + 1; update(1, 0, n - 1, idx, dp[idx]); //cout << "for " << idx << " " << dp[idx] << '\n'; res = max(res, dp[idx]); } cout << res << '\n'; } int main() { ios_base::sync_with_stdio(false); solve(); 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...