ACM-ICPC 2016 Asia Tsukuba Regional, A 解法

A: Rearranging a Sequence

問題

始めに数列1 … n がある。「数e_iを先頭に移動させる」と言う操作をm回行う(1 <= i <= m)。最後の数列を出力せよ。

解法

操作を後ろから見ていき、初めて見た数を順に拾い上げる。それらを先に出力し、残りは昇順に出力する。

コード

#include<stdio.h>
#define REP(i,n) for(int i=0, i##_len=(n); i<i##_len; ++i)

int N, M;
int E[200111];
bool use[200111];

int main() {

    scanf("%d%d", &N, &M);
    REP (i, M) scanf("%d", E+i);

    for (int i=M; i--;) {
	if (!use[E[i]]) {
	    use[E[i]] = true;
	    printf("%d\n", E[i]);
	}
    }

    for (int i=1; i<=N; i++) if (!use[i]) {
	printf("%d\n", i);
    }

    return 0;
}

感想

優しさにあふれる問題。