제출 #433358

#제출 시각아이디문제언어결과실행 시간메모리
433358couplefireThe short shank; Redemption (BOI21_prison)C++17
80 / 100
2101 ms288376 KiB
#include<bits/stdc++.h> using namespace std; const int N=2e6+5,mod=1e9+7; int t,tree[4*N],n,a[N],lazy[4*N],ans,D,removed[N],mn[N][24]; pair<int,int> tr[4*N]; pair<int,int> w[4*N]; void build(int u,int l,int r){ if(l==r) { tree[u] = a[l] - l; tr[u].second = 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]); tr[u].second = l; } void update(int u,int start,int end,int l,int r,int val) { if(lazy[u]) { tr[u].first += 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].first += 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] = 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; if(l==r) { w[u] = {st,en}; return; } int mid = (l+r)/2; insert(2*u,ind,l,mid,st,en); insert(2*u+1,ind,mid+1,r,st,en); w[u] = min(w[2*u],w[2*u+1]); } pair<int, int> get(int u,int start,int end,int l,int r) { if(l>end || r<start) return {n+5,0}; if(start <= l && r <= end) { return w[u]; } int mid=(l+r)/2; return min(get(2*u,start,end,l,mid),get(2*u+1,start,end,mid+1,r)); } signed 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]; mn[i][0] = a[i] - i; } int Lg = log2(n) + 1; for(int i=1;i<=Lg;i++) { for(int j=1;j<=n;j++) { if(j+(1<<(i-1)) <= n)mn[j][i] = min(mn[j][i-1],mn[j+(1<<(i-1))][i-1]); else mn[j][i] = mn[j][i-1]; } } 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; int lg = log2(i-mid+1); if(min(mn[i-(1<<lg)+1][lg],mn[mid][lg]) <= t-i) { ind = mid; l = mid + 1; } else r = mid - 1; } if(ind) ans++; if(ind && ind!=i) { update(1,ind+1,i,1,n,1); insert(1,i,1,n,ind+1,i); } else { insert(1,i,1,n,n+1,i); } } int b = 0; int cnt = 0; while(tr[1].first && D) { int c = tr[1].second; D--; ans -= tr[1].first; while(get(1,c,n,1,n).first <= c) { cnt++; if(cnt > n) return 0; pair<int,int> g = get(1,c,n,1,n); insert(1,g.second,1,n,n+1,g.second); removed[g.second] = 1; b ++ ; update(1,g.first,g.second,1,n,-1); } } 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...