Submission #1189362

#TimeUsernameProblemLanguageResultExecution timeMemory
1189362justinlgl20The short shank; Redemption (BOI21_prison)C++20
0 / 100
221 ms171164 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define int long long
 
#define all(x) (x).begin(), (x).end()
 
template<template<typename> class Container, typename G>
ostream& operator<<(ostream& os, Container<G> x) {
    int f = 0; os << '{'; for (auto &i: x) os << (f++ ? ", " : ""), os << i; os << "}";
    return os;
}
 
void _print() {cerr << "]\n";}
 
template<typename T, typename... V>
void _print(T t, V... v) {cerr << t; if (sizeof...(v)) cerr <<", "; _print(v...);}
 
#ifdef DEBUG
#define dbg(x...) cerr << "\e[91m"<<__func__<<":"<<__LINE__<<" [" << #x << "] = ["; _print(x); cerr << "\e[39m" << endl;
#else
#define dbg(x...)
#endif

#define pii pair<int, int>
#define f first
#define s second

vector<int> adj[2000005];
multiset<int> vals[2000005];

void solve(int u,int p){
	bool kids=false;
	pii big={-10ll,-1ll};
	for(int i:adj[u]){
		if(i==p)continue;
		kids=true;
		solve(i,u);
		big=max(big,make_pair((int)vals[i].size(),i));
	}
	if(!kids){
		vals[u].insert(1);
	}else{
		swap(vals[u],vals[big.s]);
		for(int i:adj[u]){
			if(i==p or i==big.s)continue;
			for(int j:vals[i]){
				vals[u].insert(j);
			}
		}
		int v=(*vals[u].rbegin());
		vals[u].erase(vals[u].find(v));
		vals[u].insert(v+1ll);
	}
}

int32_t main() {
	int n,d,t;cin>>n>>d>>t;vector<int>a(n),par(n,-1);for(int i=0;i<n;i++){cin>>a[i];a[i]=max(0ll, t-a[i]+1ll);}
	stack<int> s;
	for(int i=n-1;i>=0;i--){
		if(a[i]){
			// range is from [i,x] 
			int x=i+a[i]-1ll;
			dbg(i,x);
			while(s.size() and s.top()<=x){
				s.pop();
			}
		}else {
			if(s.size()){
				//adj[s.top()].push_back(i);
				par[i]=s.top();
				dbg(i,s.top());
			}
			s.push(i);
		}
	}
	// we get to take s.top() for freeeeeee
	int ans=0;
	if(s.size()){
		int x=s.top();
		while(x!=-1ll){
			// do stuff here
			ans++;
			int ox=x;
			x=par[x];
			par[ox]=-1;
		}
	}
	for(int i=0;i<n;i++){
		if(par[i]!=-1){
			adj[par[i]].push_back(i);
		}
	}
	multiset<int> sw;
	for(int i=0;i<n;i++){
		if(par[i]==-1 and a[i]==0){
			solve(i,-1);
			for(int j:vals[i]){
				sw.insert(j);
			}
		}
	}
	dbg(sw);
	auto x=sw.rbegin();
	for(int i=0;i<d and x!=sw.rend();i++,x++){
		ans+=(*x);
	}
	cout<<n-ans<<"\n";

}
#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...