Submission #405994

#TimeUsernameProblemLanguageResultExecution timeMemory
405994oolimryThe short shank; Redemption (BOI21_prison)C++17
35 / 100
2087 ms14064 KiB
#include <bits/stdc++.h> using namespace std; #define all(x) (x).begin(), (x).end() #define sz(x) ((int) x.size()) #define show(x) cerr << #x << " is " << x << endl; #define show2(x, y) cerr << #x << " is " << x << ", " << #y << " is " << y << endl; #define show3(x, y, z) cerr << #x << " is " << x << ", " << #y << " is " << y << ", " << #z << " is " << z << endl; #define l first #define r second typedef long long lint; typedef pair<lint, lint> ii; lint arr[2000005]; int p[2000005]; int vis[2000005]; int cnt = 0; int get(int u){ if(vis[u]) return 0; return get(p[u])+1; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); lint n, S, T; cin >> n >> S >> T; for(int i = 1;i <= n;i++) cin >> arr[i]; lint ans = n; vector<ii> useful; vector<ii> ranges; for(int i = 1;i <= n;i++){ if(arr[i] <= T){ int reach = min(n, i+T-arr[i]); //show2(i, reach); while(not useful.empty()){ if(useful.back().first <= reach) useful.pop_back(); else break; } useful.push_back(ii(reach,i)); } else{ auto it = lower_bound(all(useful), ii(i, -1), greater<ii>()); if(it != useful.begin()){ it--; ranges.push_back(ii(it->second,i)); } else{ ans--; } } } sort(all(ranges), [&](ii a, ii b){ if(a.l == b.l) return a.r > b.r; else return a.l < b.l; }); stack<ii> ST; for(ii R : ranges){ while(not ST.empty()){ if(ST.top().first <= R.first) ST.pop(); else break; } cnt++; if(not ST.empty()) p[cnt] = ST.top().second; ST.push(ii(R.r, cnt)); } vis[0] = 1; while(S--){ int best = 0; int bestu = 1; for(int i = 1;i <= cnt;i++){ int cur = get(i); if(cur > best){ bestu = i; best = cur; } } //show2(best, bestu); ans -= best; while(not vis[bestu]){ vis[bestu] = 1; bestu = p[bestu]; } } cout << ans; }
#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...