Submission #420225

#TimeUsernameProblemLanguageResultExecution timeMemory
420225parsabahramiFinancial Report (JOI21_financial)C++17
100 / 100
2423 ms38536 KiB
#include <bits/stdc++.h> using namespace std; typedef long long int ll; typedef pair<int, int> pii; #define SZ(x) (int) x.size() #define F first #define S second #define lc id << 1 #define rc lc | 1 const int N = 3e5 + 10, MOD = 1e9 + 7; int n, D, dp[N], A[N], seg[N << 2]; vector<int> cp, vec[N]; set<int> st1, st2; void upd(int p, int x, int id = 1, int l = 1, int r = n + 1) { if (r - l < 2) { seg[id] = x; return; } int md = (l + r) >> 1; if (p < md) upd(p, x, lc, l, md); else upd(p, x, rc, md, r); seg[id] = max(seg[lc], seg[rc]); } int get(int ql, int qr, int id = 1, int l = 1, int r = n + 1) { if (qr <= l || r <= ql || ql >= qr) return 0; if (ql <= l && r <= qr) return seg[id]; int md = (l + r) >> 1; return max(get(ql, qr, lc, l, md), get(ql, qr, rc, md, r)); } void add(int pos) { if (SZ(st1)) { if (*st1.begin() < pos) { auto it = st1.upper_bound(pos); it--; if (pos - *it > D) st2.insert(pos); it++; if (it != st1.end()) { st2.erase(*it); if (*it - pos > D) st2.insert(*it); } st1.insert(pos); } else { auto it = st1.upper_bound(pos); st1.insert(pos); if (*it - pos > D) st2.insert(*it); } } else { st1.insert(pos); } } void remove(int pos) { if (*st1.begin() < pos) { st2.erase(pos); auto it = st1.upper_bound(pos); if (it != st1.end()) { st2.erase(*it); int x = *it; it--; assert(*it == pos); it--; if (x - *it > D) st2.insert(x); } st1.erase(pos); } else { auto it = st1.upper_bound(pos); if (it != st1.end()) st2.erase(*it); st1.erase(pos); } } void print() { printf("start\n"); for (int x : st2) printf("%d ", x); printf("\nend\n"); } int main() { scanf("%d%d", &n, &D); for (int i = 1; i <= n; i++) scanf("%d", &A[i]), cp.push_back(A[i]); sort(begin(cp), end(cp)); cp.resize(unique(begin(cp), end(cp)) - begin(cp)); for (int i = 1; i <= n; i++) { int id = lower_bound(begin(cp), end(cp), A[i]) - begin(cp); vec[id].push_back(i); } for (int i = 0; i < SZ(cp); i++) { for (int &j : vec[i]) { //dp[i] = get(l, j) + 1; add(j); if (st2.empty() || *st2.begin() > j) dp[j] = get(1, j) + 1; else { auto it = st2.upper_bound(j); it--; dp[j] = get(*it, j) + 1; } remove(j); } for (int &j : vec[i]) upd(j, dp[j]), add(j); //print(); } int ret = dp[n]; st1.clear(); st2.clear(); for (int i = 0; i < SZ(cp); i++) { for (int &j : vec[i]) add(j); if (cp[i] >= A[n]) { for (int &j : vec[i]) { auto it = st2.upper_bound(j); if (it == st2.end()) ret = max(ret, dp[j]); } } } printf("%d\n", ret); return 0; }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:83:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   83 |     scanf("%d%d", &n, &D);
      |     ~~~~~^~~~~~~~~~~~~~~~
Main.cpp:85:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   85 |         scanf("%d", &A[i]), cp.push_back(A[i]);
      |         ~~~~~^~~~~~~~~~~~~
#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...