제출 #1240528

#제출 시각아이디문제언어결과실행 시간메모리
1240528skibidi123Financial Report (JOI21_financial)C++20
19 / 100
291 ms54428 KiB
#include <bits/stdc++.h> #define long long long using namespace std; int n,d; vector<int> a, coord; vector<multiset<pair<int,int>>> leaf; // per giá trị nén: giữ các (first,second) vector<pair<int,int>> st; // cây phân đoạn: mỗi node giữ min của hai con // hợp pair lex (compare.first, then compare.second) inline pair<int,int> mn(const pair<int,int>& A, const pair<int,int>& B){ return (A<B ? A : B); } void upd_leaf(int idx){ // cập nhật lá idx pair<int,int> v = leaf[idx].empty() ? make_pair(0,0) : *leaf[idx].begin(); // viết lại ở vị trí idx trên cây int p = idx + coord.size(); st[p] = v; for(p>>=1; p; p>>=1) st[p] = mn(st[p<<1], st[p<<1|1]); } // truy vấn min trên segment [L,R) pair<int,int> query(int L, int R){ pair<int,int> res = make_pair(0,0); for(L+=coord.size(), R+=coord.size(); L<R; L>>=1, R>>=1){ if(L&1) res = mn(res, st[L++]); if(R&1) res = mn(res, st[--R]); } return res; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cin>>n>>d; a.resize(n); for(int&i:a) cin>>i; // nén tọa độ coord = a; sort(coord.begin(), coord.end()); coord.erase(unique(coord.begin(), coord.end()), coord.end()); int M = coord.size(); leaf.assign(M, {}); st.assign(2*M, {0,0}); auto get_idx = [&](int x){ return int(lower_bound(coord.begin(), coord.end(), x) - coord.begin()); }; vector<pair<int,int>> f(n), q(n); // base i=0 int ix0 = get_idx(a[0]); f[0] = {-1, a[0]}; q[0] = f[0]; leaf[ix0].insert(f[0]); leaf[ix0].insert(q[0]); upd_leaf(ix0); int ans = 1; for(int i=1;i<n;i++){ int ix = get_idx(a[i]); if(i>d){ int j = i-d-1; int ixj_f = get_idx(f[j].second); leaf[ixj_f].erase(leaf[ixj_f].find(f[j])); upd_leaf(ixj_f); int ixj_q = get_idx(q[j].second); leaf[ixj_q].erase(leaf[ixj_q].find(q[j])); upd_leaf(ixj_q); } // case1: min trên toàn bộ [0,M) f[i] = query(0, M); if(a[i]>f[i].second){ f[i].first--; f[i].second = a[i]; } ans = max(ans, -f[i].first); leaf[get_idx(f[i].second)].insert(f[i]); upd_leaf(get_idx(f[i].second)); // case2: min trên [0, ix) (các last < a[i]) if(ix>0){ q[i] = query(0, ix); q[i].first--; q[i].second = a[i]; } else { q[i] = {-1, a[i]}; } ans = max(ans, -q[i].first); leaf[ix].insert(q[i]); upd_leaf(ix); } cout<<ans; 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...