83 B Doctor

問題

n匹の動物が検査の列に並んでいる。
i番目の動物はa[i]回検査を受ける。


検査がまだ残っている動物は、列の最後尾に並び直し、検査が全て終わった動物は列から消える。


検査をk回行った後の列の状態を出力せよ。

制約条件

n≦10^5,
k≦10^14

方針

愚直にシミュレートするとTLEするのでちょっと工夫してシミュレートする。
検査をa0回受ける人がb0人、a1回受ける人がb1人……というようにデータを並べる。


b0人が全ていなくなるまでに、検査は(人数)*a0回行われる。
b1人が全ていなくなるまでに、検査は(人数-b0)*b1回行われる……

kから引けなくなるまでこれを繰り返し、残りの部分については単純にシミュレートする。

ソースコード

int n,a[100000];
ll k;

void run(){
	cin>>n>>k;
	
	map<int,int> m;
	ll sum=0;
	rep(i,n)cin>>a[i], sum+=a[i], m[a[i]]++;
	
	if(sum<=k){
		if(sum==k)cout<<endl;
		else cout<<-1<<endl; return;
	}
	
	ll shuu=0, num=n;
	fr(i,m){
		if(k>=(i->first-shuu)*num)k-=(i->first-shuu)*num, num-=i->second, shuu=i->first;
		else break;
	}
	
	shuu+=k/num, k%=num;
	
	vi first, last; int i=0;
	for(;k&&i<n;i++){
		if(a[i]<=shuu)continue;
		if(a[i]>shuu+1){
			last.pb(i+1);
		}
		k--;
	}
	for(;i<n;i++){
		if(a[i]>shuu)first.pb(i+1);
	}
	first.insert(first.end(),last.begin(),last.end());
	
	rep(i,first.size())cout<<first[i]<<(i==first.size()-1?"\n":" ");
}