読者です 読者をやめる 読者になる 読者になる

君はまるで砂漠に咲く、一輪の花。

僕はその花に引き寄せられる蝶。

Codeforces Round #315 (Div.2)

はい。

B. Inventory

ざっくりと大意

・会社の機材管理の番号を若い数字から振り直す??
・番号を振り直さなくていいものはそのまま使い、それ以外は制限がない??
・試してみたところサンプル2は4 2 1 3の出力でもよくて、より左のものを優先するなどのルールはなさそう

方針のようなもの

・何回もn個の要素を調べようとするとTLEになるのでなんとかする

python

n=int(raw_input())
a=map(int,raw_input().split())
l=set(a)
ans=[0]*n
tmp=set(range(1,n+1))
tmp=list(tmp-l)
for i in a:
    if i in l and i<=n:
        print i,
        l.remove(i)
    else:
        print tmp.pop(),

1からnまでの数をset型で用意して、入力の数列aをset型にしたものと差分を見ると1以上n以下の数でaの中に無いものが残る。
数列aを先頭から見てn以下で出てきたのが1回目ならそれを出力。n以上の大きさか出てくるのが2回目以上なら番号を割り振らないとなので、aの中に差分リストから使って出力。この差分リストはおそらく昇順にも降順にもなっていないがそれは制限になっていないので適当にpopで取り出して使った。