제출 #1290292

#제출 시각아이디문제언어결과실행 시간메모리
1290292Jawad_Akbar_JJFinancial Report (JOI21_financial)C++20
100 / 100
206 ms11160 KiB
#include <iostream> #include <deque> #include <algorithm> using namespace std; const int N = (1<<19) + 1; int a[N], Mn[N], Mx[N<<1], R[N], dp[N], n, d, Ans; void insert(int i, int vl, int cur = 1, int st = 1, int en = N){ if (i < st or i >= en) return; if (en - st == 1){ Mx[cur] = vl; return; } int lc = cur + cur, rc = lc + 1, mid = (st + en) / 2; insert(i, vl, lc, st, mid); insert(i, vl, rc, mid, en); Mx[cur] = max(Mx[lc], Mx[rc]); } int get(int l, int r, int cur = 1, int st = 1, int en = N){ if (l >= en or r <= st) return 0; if (l <= st and r >= en) return Mx[cur]; int lc = cur + cur, rc = lc + 1, mid = (st + en) / 2; return max(get(l, r, lc, st, mid), get(l, r, rc, mid, en)); } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin>>n>>d; for (int i=1;i<=n;i++) cin>>a[i]; deque<int> dq; deque<pair<int, int>> vc; for (int i=1;i<=n;i++){ while (dq.size() > 0 and a[dq.back()] >= a[i]) dq.pop_back(); dq.push_back(i); if (dq.front() <= i - d) dq.pop_front(); Mn[i] = a[dq.front()]; } dq.clear(); for (int i=n;i>=1;i--){ int l = -1, r = dq.size(); while (l + 1 < r){ int mid = (l + r) / 2; if (Mn[dq[mid]] <= a[i]) l = mid; else r = mid; } if (r == dq.size()) R[i] = n + 1; else R[i] = dq[r]; while (dq.size() > 0 and Mn[dq.front()] <= Mn[i]) dq.pop_front(); dq.push_front(i); vc.push_back({-a[i], i}); } sort(begin(vc), end(vc)); for (auto [vl, i] : vc){ dp[i] = get(i, R[i] + 1) + 1; insert(i, dp[i]); Ans = max(Ans, dp[i]); } cout<<Ans<<'\n'; }
#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...