제출 #1149866

#제출 시각아이디문제언어결과실행 시간메모리
1149866IssaFinancial Report (JOI21_financial)C++20
100 / 100
240 ms24392 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; #define ent "\n" const int maxn = 1e6 + 100; const ll INF = (ll)1e18 + 100; const int inf = 1e7 + 100; const ll MOD = 1e9 + 7; const int maxl = 16; const ll P = 31; int n, D; int a[maxn]; int dp[maxn]; set<int> st; int l[maxn]; int r[maxn]; int d[maxn * 4]; void upd(int i, int v = 1, int tl = 1, int tr = n){ d[v] = max(d[v], dp[i]); if(tl < tr){ int mid = (tl + tr) >> 1; if(i <= mid) upd(i, v<<1, tl, mid); else upd(i, v<<1|1, mid+1, tr); } } int get(int l, int r, int v = 1, int tl = 1, int tr = n){ if(tl > r || tr < l) return -inf; if(l <= tl && tr <= r) return d[v]; int mid = (tl + tr) >> 1; return max(get(l, r, v<<1, tl, mid) , get(l, r, v<<1|1, mid+1, tr)); } void del(int i){ upd(i); if(r[i] - l[i] > D) st.insert(l[i]); r[l[i]] = r[i]; l[r[i]] = l[i]; } void test(){ cin >> n >> D; vector<int> v; for(int i = 1; i <= n; i++){ l[i] = i-1; r[i] = i+1; cin >> a[i]; v.push_back(i); } sort(v.begin(), v.end(), [](int i, int j){ if(a[i] == a[j]) return i < j; return a[i] > a[j]; }); for(int i: v){ auto it = st.lower_bound(i); int r; if(it == st.end()) r = n; else r = min(n, *it + D); dp[i] = get(i, r); if(r == n) dp[i] = max(dp[i], 0); dp[i]++; del(i); } cout << d[1]; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); srand(time(0)); int t = 1; while(t--) test(); }
#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...