公式

A - パスワードの復元 / Password Recovery 解説 by MtSaka 印刷ページ


初心者の方へ


\(P\) の各要素を特定していくことを考えます。

\(P_i\) を特定するにあたって、\(1 \leq j \leq N\) について \(S_{j,i}=-1\) であれば \(P_i\) はどのような値でもよいです。そうでない場合は \(S_{j,i}\neq -1\) となる \(j\) が一つは存在しそれを \(j'\) とすると、\(P_i=S_{j',i}\) である必要がある。あとは実際にこの \(P_i\) の値で他の\(j\) について \(S_{j,i} \neq -1 \implies S_{j,i}=P_i\) となるかを確認すればよいです。

すべての要素 \(P_i\) について条件を満たすときのみ、Yes と答えそれ以外では No と答えれば正解を得られます。

実装例(C++)

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> s(n, vector<int>(m));
    for (auto& v : s)
        for (auto& e : v) cin >> e;
    for (int j = 0; j < m; ++j) {
        int val = -1;
        bool flag = true;
        for (int i = 0; i < n; ++i) {
            if (s[i][j] == -1) continue;
            if (val == -1)
                val = s[i][j];
            else if (val != s[i][j]) {
                flag = false;
                break;
            }
        }
        if (!flag) {
            cout << "No" << endl;
            return 0;
        }
    }
    cout << "Yes" << endl;
}

投稿日時:
最終更新: