Submission #501742

#TimeUsernameProblemLanguageResultExecution timeMemory
501742talant117408Financial Report (JOI21_financial)C++17
5 / 100
332 ms12348 KiB
/* Code written by Talant I.D. */ #include <bits/stdc++.h> //~ #include <ext/pb_ds/assoc_container.hpp> //~ using namespace __gnu_pbds; using namespace std; typedef long long ll; typedef pair <int, int> pii; typedef pair <ll, ll> pll; //~ typedef tree <ll, null_type, less_equal <ll>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; #define precision(n) fixed << setprecision(n) #define pb push_back #define ub upper_bound #define lb lower_bound #define mp make_pair #define eps (double)1e-9 #define PI 2*acos(0.0) #define endl "\n" #define sz(v) ll((v).size()) #define all(v) v.begin(),v.end() #define rall(v) v.rbegin(),v.rend() #define do_not_disturb ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define OK cout << "OK" << endl; const ll mod = 998244353 ; ll mode(ll a) { a %= mod; while (a < 0) { a += mod; } return a; } ll subt(ll a, ll b) { return mode(mode(a)-mode(b)); } ll add(ll a, ll b) { return mode(mode(a)+mode(b)); } ll mult(ll a, ll b) { return mode(mode(a)*mode(b)); } ll binpow(ll a, ll b) { ll res = 1; while (b) { if (b&1) res = mult(res, a); a = mult(a, a); b >>= 1; } return res; } const int N = 3e5+7; int ans = 1; int tree[N*4], order[N]; vector <pii> sorted; int n, d; void update(int v, int l, int r, int pos, int val) { if (l == r) { tree[v] = val; return; } int mid = (l+r) >> 1; if (pos <= mid) update(v*2, l, mid, pos, val); else update(v*2+1, mid+1, r, pos, val); tree[v] = max(tree[v*2], tree[v*2+1]); } int get(int v, int l, int r, int ql, int qr) { if (l > qr || ql > r) return 0; if (ql <= l && r <= qr) return tree[v]; int mid = (l+r) >> 1; return max(get(v*2, l, mid, ql, qr), get(v*2+1, mid+1, r, ql, qr)); } int main() { do_not_disturb cin >> n >> d; vector <int> v(n); for (auto &to : v) cin >> to; for (int i = 0; i < n; i++) { sorted.pb(mp(v[i], i)); } sort(all(sorted)); for (int i = 0; i < n; i++) { order[sorted[i].second] = i+1; } for (int i = n-1; i >= 0; i--) { if (i + d + 1 < n) { update(1, 1, n, order[i + d + 1], 0); } auto it = lb(all(sorted), mp(v[i]+1, 0))-sorted.begin(); if (it == n) { update(1, 1, n, order[i], 1); continue; } update(1, 1, n, order[i], get(1, 1, n, it+1, n)+1); ans = max(ans, get(1, 1, n, order[i], order[i])); } 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...