Codeforces 141 C. Queue

解をどれか一つタグを追加。
ロシアっぽい(?)

問題

列にn人が並んでいる。
それぞれの人の、「自分の前にいて、自分より身長が高い人の数」a[i]が与えられる。
元の列としてありうるものをどれか一つ出力せよ。

制約条件

n≦3000

方針

まずは前にいる身長が高い人の数が少ない順にソート。
列を後ろから決めていく。

身長は1〜nの整数としていい。
前にi人自分より身長の高い人がいたら、まだ1〜nのうち使ってない整数のうちi番目に大きいものを使う。


それで作れなかったら無理。

ソースコード

int n,h[3000],use[3001];
vector<pair<int,string> > v;

void run()
{
	cin>>n;
	v.clear();
	v.resize(n);
	rep(i,n)cin>>v[i].second>>v[i].first;
	sort(all(v));
	rep(i,n)if(v[i].first>i){
		cout<<-1<<endl;
		return;
	}
	memset(use,0,sizeof(use));
	for(int i=n-1;i>=0;i--){
		int c=v[i].first, j=0;
		for(;j<n;j++)if(!use[j]){
			if(c--==0)break;
		}
		use[j]=1;
		h[i]=n-j;
	}
	rep(i,n)cout<<v[i].second<<" "<<h[i]<<endl;
}