67 B Restoration of the Permutation

問題

数列a[i]と自然数kに対してb[i]を次のように定める。
b[i]=(aのうち、a[j]=iの項の左側にあるi+k以上の項の数)


b[i]とkが与えられるとき、辞書順で最小となるa[i]を求めよ。

方針

b[i]=0になるようなiのうち最小のものをi0とすれば、
a[0]=i0である。


0番目にi0が来たので、b[0]〜b[j-k]のそれぞれから1を引く。
この操作を繰り返してa[i]を順次出力していけばいい。

ソースコード

int n,k,a[1000],ans[1000];
bool use[1000];

void run(){
	cin>>n>>k;
	rep(i,n)cin>>a[i], use[i]=0;
	
	rep(i,n){
		rep(j,n)if(!use[j]&&a[j]==0){
			use[j]=1;
			ans[i]=j+1;
			for(int h=0;h<=j-k;h++)a[h]--;
			break;
		}
	}
	rep(i,n)cout<<ans[i]<<(i==n-1?"\n":" ");
}