Official

B - Piano 2 Editorial by sotanishy


この問題では,数列の要素を順番に並べ替えることが問われています.これは,ソートと呼ばれる操作で,多くの言語で標準機能として提供されています.たとえば, Python, C++ ではともに sort という関数が提供されています.

この問題を解くには,\(A\)\(B\) を結合した数列 \(C\) を用意し, \(C\) をソートしたあと, \(C\) の要素を順番に見ていって隣り合う要素がともに \(A\) に含まれているかを調べればよいです.

ある値が数列に含まれているかどうかの判定には,たとえば Python では in 演算子を,C++ では set を用いるのが便利です.

実装例 (Python)

N, M = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
C = A + B
C.sort()
for i in range(N + M - 1):
    if C[i] in A and C[i + 1] in A:
        print("Yes")
        exit()
print("No")

実装例 (C++)

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N, M;
    cin >> N >> M;
    vector<int> A(N), B(M);
    for (auto& x : A) cin >> x;
    for (auto& x : B) cin >> x;

    auto C = A;
    for (auto x : B) C.push_back(x);
    sort(C.begin(), C.end());

    set<int> st(A.begin(), A.end());

    for (int i = 0; i < N + M - 1; ++i) {
        if (st.contains(C[i]) && st.contains(C[i + 1])) {
            cout << "Yes" << endl;
            return 0;
        }
    }
    cout << "No" << endl;
}

posted:
last update: