85B Embassy Queue

問題

大使館にn人の人がやってくる。i番目の人がくる時刻はc[i]である。
大使館では3つの手続きを、決まった順に行う必要がある。


1番目の手続きにはt1の時間がかかり、窓口はk1個ある。
2番目の手続きにはt2の時間がかかり、窓口はk2個ある。
3番目の手続きにはt3の時間がかかり、窓口はk3個ある。


手続き以外にかかる時間を0とするとき、最も時間がかかる人が手続きを終えるまでにかかる時間を求めよ。

制約条件

k1,k2,k3≦10^9
t1,t2,t3≦10^5
n≦10^5
c[i]≦10^9

方針

それぞれの手続きにおいて、完了する時刻をシミュレートによって求める。
このシミュレートは、queueを使い、

  • k人手続き中のときは、時間を進める
  • k人未満が手続き中のときは早い人に手続きをさせる

操作を愚直にやればよい。

ソースコード

ll n,c[100000],A[100000],B[100000],C[100000];
ll q[100000];

void solve(ll *a,ll *r,ll k,ll t){
	ll tm=0,hd=0,tl=0,s=0;
	rep(i,n){
		while(hd<tl&&tm>=q[hd])r[s++]=q[hd++];
		if(tl-hd<k)q[tl++]=max(tm,a[i])+t;
		else tm=q[hd], i--;
	}
	while(hd<tl)r[s++]=q[hd++];
}

void run(){
	ll k1,k2,k3,t1,t2,t3;
	
	cin>>k1>>k2>>k3;
	cin>>t1>>t2>>t3;
	cin>>n;
	
	rep(i,n)cin>>c[i];
	solve(c,A,k1,t1);
	solve(A,B,k2,t2);
	solve(B,C,k3,t3);
	
	ll ans=0; rep(i,n)ans=max(ans,C[i]-c[i]);
	cout<<ans<<endl;
}