제출 #405993

#제출 시각아이디문제언어결과실행 시간메모리
405993oolimryThe short shank; Redemption (BOI21_prison)C++17
35 / 100
2077 ms14056 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] or u == 0) 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--;
				//show2(i, it->second);
				ranges.push_back(ii(it->second,i));
			}
			else{
				//show2("F", i);
				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){
		//show2(R.first, R.second);
		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));
	}
	
	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(bestu != 0){
			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...