제출 #429686

#제출 시각아이디문제언어결과실행 시간메모리
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; }

컴파일 시 표준 에러 (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...