Submission #653438

#TimeUsernameProblemLanguageResultExecution timeMemory
653438inksamuraiThe short shank; Redemption (BOI21_prison)C++17
10 / 100
541 ms72248 KiB
#include <bits/stdc++.h> #define int ll using namespace std; #define rep(i,n) for(int i=0;i<n;i++) #define per(i,n) for(int i=n-1;i>=0;i--) #define rng(i,c,n) for(int i=c;i<n;i++) #define fi first #define se second #define pb push_back #define sz(a) (int)a.size() #define vec(...) vector<__VA_ARGS__> #define _3D2ZDxo ios::sync_with_stdio(0),cin.tie(0) typedef long long ll; using pii=pair<int,int>; using vi=vector<int>; void print(){cout<<'\n';} template<class h,class...t> void print(const h&v,const t&...u){cout<<v<<' ',print(u...);} void chmax(pii&a,pii b){ if(a.fi<b.fi){ a=b; }else if(a.fi==b.fi){ a.se=min(a.se,b.se); } } struct lazy_segtree{ int n; vec(pii) seg; vi lazy,flag; lazy_segtree(int m){ init(m); } void init(int m){ n=1; while(n<=m){ n*=2; } n*=2; seg.clear(); lazy.clear(); flag.clear(); seg.resize(n+1,{0,0}); lazy.resize(n+1,0); flag.resize(n+1,false); n=m; } void build(int node,int l,int r){ if(l==r-1){ seg[node].fi=0; seg[node].se=l; return; } int m=(l+r)>>1; build(node*2,l,m); build(node*2+1,m,r); seg[node].se=l; } void push(int l,int r,int node){ if(flag[node]){ seg[node].fi+=lazy[node]; // print(l,r,seg[node].fi,node,sz(seg)); if(node*2<sz(lazy)){ lazy[node*2]+=lazy[node]; flag[node*2]=true; } if(node*2+1<sz(lazy)){ lazy[node*2+1]+=lazy[node]; flag[node*2+1]=true; } flag[node]=false; lazy[node]=0; } } void set(int node,int l,int r,int x,int _l,int _r){ push(l,r,node); if(l>=_r or r<=_l){ return; } if(l>=_l and r<=_r){ lazy[node]+=x; flag[node]=true; push(l,r,node); return; } int m=(l+r)>>1; set(node*2,l,m,x,_l,_r); set(node*2+1,m,r,x,_l,_r); // prod seg_node seg[node]={0,0}; chmax(seg[node],seg[node*2]); chmax(seg[node],seg[node*2+1]); // print(seg[node].fi,seg[node].se,l,r); } pii prod(int node,int l,int r,int _l,int _r){ push(l,r,node); // _e if(l>=_r or r<=_l){ return {0,0}; } if(l>=_l and r<=_r){ // print(node,seg[node].fi,seg[node].se); return seg[node]; } int m=(l+r)>>1; pii vl=prod(node*2,l,m,_l,_r); pii vr=prod(node*2+1,m,r,_l,_r); print(vl.fi,vl.se,vr.fi,vr.se); chmax(vl,vr); return vl; } void build(){ build(1,0,n); } void set(int l,int r,int x){ // [l,r) assert(l<r); set(1,0,n,x,l,r); } pii prod(int l,int r){ // [l,r) return prod(1,0,n,l,r); } }; signed main(){ _3D2ZDxo; int n,k,t; cin>>n>>k>>t; k=min(k,n); vi a(n); rep(i,n){ cin>>a[i]; } vi dl(n,-1); { set<pii> st; rep(i,n){ if(sz(st)){ auto it=st.lower_bound({i,-1}); if(it!=st.end()){ dl[i]=(*it).se; } } int val=t-a[i]+i; while(sz(st)){ auto it=st.begin(); pii p=*it; if(p.fi>val) break; st.erase(it); } st.insert({val,i}); } } lazy_segtree seg(n); set<pii> st; int ans=n; rep(i,n){ if(a[i]<=t){ }else if(dl[i]==-1){ ans-=1; }else{ seg.set(dl[i],i+1,1); st.insert({dl[i],i}); } } while(k){ pii p=seg.prod(0,n); if(p.fi==0){ break; } ans-=p.fi; // print(p.se,); while(sz(st)){ auto it=st.lower_bound({p.fi,-1}); if(it==st.end()){ break; } pii rabbit=*it; st.erase(it); seg.set(rabbit.fi,rabbit.se+1,-1); } k-=1; } // while(k){ // vi cnt(n); // rep(i,n){ // if(usd[i]) continue; // cnt[dl[i]]+=1; // if(i+1<n){ // cnt[i+1]-=1; // } // } // rng(i,1,n){ // cnt[i]+=cnt[i-1]; // } // int pvt=-1; // int ma=0; // rep(i,n){ // if(cnt[i]>ma){ // ma=cnt[i]; // pvt=i; // } // } // rep(i,n){ // if(usd[i]) continue; // if(dl[i]<=pvt and pvt<=i){ // usd[i]=1; // ans-=1; // } // } // k-=1; // } print(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...