はまやんはまやんはまやん

hamayanhamayan's blog

intersection [第八回 アルゴリズム実技検定 B]

https://atcoder.jp/contests/past202109-open/tasks/past202109_b

解説

https://atcoder.jp/contests/past202109-open/submissions/26585385

やや工夫が必要になる問題。
配列A,Bに含まれる数は制約からすべて別々であるということから、
重複とかは考えずに、単純にA[i] == B[j]を満たすようなものを選択して値の小さい順に答えていく。
配列Aと配列Bが値の小さい順になっているとは限らないので、一旦答えを配列ansに保持しておいて、
最後にソートしてから答えることにする。

A[i] == B[j]を満たすような(i,j)を探せばいいので、iとjをそれぞれ探索するような2重ループを書こう。
条件を満たすような数が見つかれば、それを配列ansに入れていく。

値の小さい順に答える必要があるので、答える前にソートをしよう。
C++であればsort関数を使う。
自分は特殊なマクロで書いているが、マクロなしだとsort(ans.begin(), ans.end());といった感じになるだろう。

後は答えるだけであるが、少し見栄えを気にして前の要素があれば空白を入れるなどしている。
多分昨今は無駄なスペースがあっても通るような気がするが、別の競プロサイトはAtCoderほどしっかりしてない可能性もあるので、
自分はなるべく要求通りに書くようにしている。

int N, M;
int A[1010];
int B[1010];
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N >> M;
    rep(i, 0, N) cin >> A[i];
    rep(i, 0, M) cin >> B[i];

    vector<int> ans;
    rep(i, 0, N) rep(j, 0, M) if (A[i] == B[j]) ans.push_back(A[i]);
    sort(all(ans));

    rep(i, 0, ans.size()) {
        if (0 < i) printf(" ");
        printf("%d", ans[i]);
    }
    printf("\n");
}