Submission #444187

#TimeUsernameProblemLanguageResultExecution timeMemory
4441878e7The short shank; Redemption (BOI21_prison)C++17
0 / 100
21 ms19844 KiB
//Challenge: Accepted
#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
#include <queue>
#include <set>
#include <stack>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
//using namespace __gnu_pbds;
void debug() {cout << endl;}
template<class T, class ... U> void debug(T a, U ... b) {cout << a << " ", debug(b ...);}
template<class T> void pary(T l, T r) {
	while (l != r) cout << *l << " ", l++;
	cout << endl;
}
#define ll long long
#define maxn 500005
#define pii pair<int, int>
#define ff first
#define ss second
#define io ios_base::sync_with_stdio(0);
//int f[maxn][maxn], dp[2][maxn];
int rig[maxn], pref[maxn], suf[maxn];
struct segtree{
	struct node{
		int sum;
		bool tag;
		node * lc, * rc;
		node() {sum = 0, tag = 0, lc = NULL, rc = NULL;}
	};
	node * root = new node();
	void pull(node *cur, int l, int r) {
		if (cur->tag) {
			cur->sum = r - l;
			return;
		}
		cur->sum = cur->lc->sum + cur->rc->sum;
	}
	void modify(node * cur, int l, int r, int ql, int qr) {
		if (r <= l || ql >= r || qr <= l) return;
		if (ql <= l && qr >= r) {
			cur->tag = 1, cur->sum = r - l;
			return;
		}
		int mid = (l + r) / 2;
		cur->lc = new node();
		cur->rc = new node();
		modify(cur->lc, l, mid, ql, qr), modify(cur->rc, mid, r, ql, qr);
		pull(cur, l, r);	
	}
	int query(node * cur, int l, int r, int ql, int qr) {
		if (r <= l || ql >= r || qr <= l) return 0;
		if (ql <= l && qr >= r) return cur->sum;
		int mid = (l + r) / 2;
		if (cur->tag) return min(r, qr) - max(l, ql);
		return (cur->lc ? query(cur->lc, l, mid, ql, qr) : 0) + 
			(cur->rc ? query(cur->rc, mid, r, ql, qr) : 0);
	}	
} seg[maxn];
/*
void solve(int l, int r, int ql, int qr) {
	if (l >= r) return;
	int mid = (l + r) / 2;
	int bind = mid - 1;
	for (int i = ql;i < min(qr, mid);i++) {
		int val = dp[0][i] + f[i + 1][mid];	
		//debug(i, val, dp[1][mid]);
		if (val < dp[1][mid]) {
			dp[1][mid] = val;
			bind = i;
		}
	}
	//debug(mid, bind, ql, qr);
	if (r - l > 1) {
		solve(l, mid, ql, bind + 1);
		solve(mid + 1, r, bind, qr);
	}
}
*/
const int inf = 8e7;
int main() {
	io
	int n, k, t;
	cin >> n >> k >> t;
	for (int i = 1;i <= n;i++) {
		int ti;
		cin >> ti;
		if (ti <= t) {
			rig[i] = min(n, i + t - ti); //[i, a[i]]
		} 
	}
	int pr = 0;
	for (int i = 1;i <= n;i++) {
		pr = max(pr, rig[i]);
		pref[i] = pref[i - 1] + (pr >= i ? 1 : 0);
	}	
	pr = n;
	for (int i = n;i > 0;i--) {
		seg[i].root->lc = seg[i + 1].root->lc, seg[i].root->rc = seg[i + 1].root->rc;
		if (rig[i]) {
			seg[i].modify(seg[i].root, 1, n + 1, i, rig[i] + 1);	
		}
		suf[i] = seg[i].query(seg[i].root, 1, n + 1, i, n + 1);
	}	
	//pary(suf + 1, suf + n + 1);
	int ans = suf[1];
	for (int i = 1;i <= n;i++) {
		ans = min(ans,pref[i] + suf[i + 1]); 
	}
	cout << ans << endl;
	/*
	for (int i = 1;i <= n;i++) dp[0][i] = f[1][i], dp[1][i] = inf;
	for (int i = 1;i <= k;i++) {
		solve(1, n + 1, 0, n + 1);	
		for (int j = 1;j <= n;j++) dp[0][j] = dp[1][j], dp[1][j] = inf;
		//pary(dp[0], dp[0] + n + 1);
	}
	cout << dp[0][n] << endl;
	*/
}
/*
5 1 42
13 37 47 11 42
  */
#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...