Submission #429686

#TimeUsernameProblemLanguageResultExecution timeMemory
429686keta_tsimakuridzeThe short shank; Redemption (BOI21_prison)C++14
10 / 100
2067 ms121904 KiB
#include<bits/stdc++.h>
#define f first
#define s second
#define pii pair<int,pair<int,int> > 
using namespace std;
const int N=2e5+5,mod=1e9+7;
int t,tree[4*N],n,a[N],lazy[4*N],ans,D;
set< pii > s[4*N];
pair<int,int> tr[4*N];
void build(int u,int l,int r){
	if(l==r)  {
		tree[u] = a[l] - l; tr[u].s = l;
		return;
	}
	int mid=(l+r)/2;
	build(2*u,l,mid);
	build(2*u+1,mid+1,r);
	tree[u] = min(tree[2*u],tree[2*u+1]);
}
int getans(int u,int start,int end,int l,int r) {
	if(l>end || r<start) return t+55;
	if(start<=l && r<=end) return tree[u];
	int mid=(l+r)/2;
	return min(getans(2*u,start,end,l,mid),getans(2*u+1,start,end,mid+1,r));
}
void update(int u,int start,int end,int l,int r,int val) {
	if(lazy[u]) {
		tr[u].f += lazy[u];
		if(l!=r){
			lazy[2*u] += lazy[u];
			lazy[2*u+1] += lazy[u];
		}
		lazy[u] = 0;
	}
	if(l>end || r<start) return;
	if(start<=l && r<=end) {
		lazy[u] = val;
		tr[u].f += lazy[u];
		if(l!=r){
			lazy[2*u] += lazy[u];
			lazy[2*u+1] += lazy[u];
		}
		lazy[u] = 0;		
		return;
	} 
	int mid = (l+r)/2;
	update(2*u,start,end,l,mid,val);
	update(2*u+1,start,end,mid+1,r,val);
	tr[u] = tr[2*u+1];
	tr[u] = max(tr[2*u],tr[2*u+1]);
}
void insert(int u,int ind,int l,int r,int st,int en) {
	if(l>ind || r<ind) return; 
	s[u].insert({en,{st,en}});
	if(l==r) {
		return;
	}
	int mid = (l+r)/2;
	insert(2*u,ind,l,mid,st,en);
	insert(2*u+1,ind,mid+1,r,st,en);
}
void remove(int u,int ind,int l,int r,int st,int en) {
	if(l>ind || r<ind) return; 
	s[u].erase({en,{st,en}});
	if(l==r) {
		return;
	}
	int mid = (l+r)/2;
	remove(2*u,ind,l,mid,st,en);
	remove(2*u+1,ind,mid+1,r,st,en);
}
pii get(int u,int start,int end,int l,int r) {
	if(l>end || r<start || !s[u].size()) return {0,{0,0}};
	if(start <= l && r <= end) {
		return *--s[u].end();
	}
	int mid=(l+r)/2;
	return max(get(2*u,start,end,l,mid),get(2*u+1,start,end,mid+1,r));
}
main(){
	ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n>>D>>t;
	
	for(int i=1;i<=n;i++) {
		cin >> a[i];
		
		// a[j]  - j < t - i
		
	} 	
	build(1,1,n);
	for(int i=1;i<=n;i++){
		int l = 1, r =i,ind = 0;
		while(l<=r){
			int mid=(l+r)/2;
			if(getans(1,mid,i,1,n) <= t-i) {
				ind = mid;
				l = mid + 1;
			}
			else r = mid - 1; 
		}	
		if(ind) ans++;
		if(ind && ind!=i)  { //cout<<ind<<" "<<i<<endl;
			update(1,ind+1,i,1,n,1);
			insert(1,ind+1,1,n,ind+1,i);
		}
	}  
	int cnt  = 0;
	while(tr[1].f && D) {
		int c = tr[1].s; D--; ans -= tr[1].f; //cout<<c<<endl;
		while(get(1,1,c,1,n).f >= c) { cnt++;
			if(cnt > n) {
				cout<<"??";
				return 0;
			}
			pair<int,int> g = get(1,1,c,1,n).s;
			remove(1,g.f,1,n,g.f,g.s);
			update(1,g.f,g.s,1,n,-1); 
		}
	} 
	cout<<ans;
}

Compilation message (stderr)

prison.cpp:80:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   80 | main(){
      | ^~~~
#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...