Submission #868561

#TimeUsernameProblemLanguageResultExecution timeMemory
868561NaimSSThe short shank; Redemption (BOI21_prison)C++14
0 / 100
52 ms109140 KiB
#include <bits/stdc++.h>
#define sz(v) ((int)v.size())
#define rep(i,a,b) for(int i=(a);i<(b);++i)
#define per(i,a,b) for(int i=(b)-1;i>=(a);--i)
#define pb push_back
#define ff first
#define ss second
#define endl '\n'
#define sz(v) ((int)v.size())
#define all(v) begin(v),end(v)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;

void dbg_out() { cerr << endl ;}
template<typename Head, typename... Tail> void dbg_out(Head H,Tail... T){
	cerr<<' '<<H ;
	dbg_out(T...);
}
#ifdef LOCAL
#define dbg(...) cerr<<"("<< #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__), cerr << endl;
#else 
#define dbg(...) 42
#endif

const int N = 2e6 + 10;
int t[N];
int nxt[N];
int H[N];
int id[N];
int vis[N];
vi g[N];

void dfs(int v,int p=-1){
	if(p==-1)H[v] = 0;
	vis[v] = 1;
	for(auto to : g[v])if(to!=p){
		H[to] = H[v] + 1;
		assert(!vis[to]);
		dfs(to,v);
	}
}

int32_t main(){
	ios_base::sync_with_stdio(0);cin.tie(0);
	int n,d,T;
	cin >> n >> d >> T;
	rep(i,1,n+1)cin >> t[i];

	int ans = n;
	int Mx=0;

	stack<pii> S;
	int curId=0;
	for(int i=1;i<=n;i++){
		int cur = i + T - t[i];
		Mx = max(Mx,cur);
		if(!S.empty())S.top().ss = max(S.top().ss, cur);
		if(t[i] > T){
			if(Mx < i){
				ans--;
				continue;
			}
			int last = -1;
			while(!S.empty()){
				int cur = S.top().ff;
				last = max(last, S.top().ss);
				if(last >= i)break;
				dbg(cur , id[cur], last);
				nxt[id[cur]] = curId;
				S.pop();
			}
			S.push({i, -1});
			id[i] = curId++;
			nxt[id[i]] = -1;
			dbg(i,id[i]);
		}
	}
	for(int i=0;i<curId;i++){
		assert(nxt[i] > i);
		if(nxt[i]!=-1){
			g[nxt[i]].pb(i);
		}
	}
	rep(i,0,curId)if(!vis[i]){
		dfs(i);
	}
	vi ids;
	rep(i,0,curId)ids.pb(i);
	sort(all(ids),[&](int a,int b){
		return H[a] > H[b];
	});
	memset(vis,0,sizeof(vis));
	priority_queue<int> pq;
	for(auto i : ids){
		int val = 0;
		while(i!=-1 && !vis[i]){
			vis[i] = 1,val++;
			i = nxt[i];
		}
		pq.push(val);
	}
	while(d-- && sz(pq))ans -= pq.top(),pq.pop();
	cout << ans << endl;
}

Compilation message (stderr)

prison.cpp: In function 'int32_t main()':
prison.cpp:25:18: warning: statement has no effect [-Wunused-value]
   25 | #define dbg(...) 42
      |                  ^~
prison.cpp:71:5: note: in expansion of macro 'dbg'
   71 |     dbg(cur , id[cur], last);
      |     ^~~
prison.cpp:25:18: warning: statement has no effect [-Wunused-value]
   25 | #define dbg(...) 42
      |                  ^~
prison.cpp:78:4: note: in expansion of macro 'dbg'
   78 |    dbg(i,id[i]);
      |    ^~~
#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...