D - Strictly Superior 解説 by bayashiko

生配列、for文、if文のみを用いた実装例(C++)

例えば以下のようにして、生配列、for文、if文(とiostreamによる入出力)だけで正しいコードを記述出来ます。計算量は公式解説と同じく \(O(N^2M)\) で、十分高速です。

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

int main(void){
    int N,M;
    cin >> N >> M;
    int P[N];
    bool func[N][M]={}; //func[i][j]:i番目の商品がj番目の機能を持つか(0-indexed)
    for(int i=0;i<N;i++){
        cin >> P[i];
        int c;
        cin >> c;
        for(int j=0;j<c;j++){
            int f;
            cin >> f;
            f--; //0-indexedに直す
            func[i][f]=true;
        }
    }
    bool ans=false; //条件をすべて満たす(i,j)のペアが存在するか
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            bool cond1=false; //P_i>=P_jかどうか
            bool cond2=true; //j番目の製品がi番目の製品が持つ機能をすべてもつかどうか
            bool cond3=false; //P_i>P_jである、またはj番目の製品がi番目の製品にない機能を1つ以上もつかどうか
            if(P[i]>=P[j]) cond1=true;
            for(int k=0;k<M;k++){
                if(func[i][k] && !func[j][k]) cond2=false; //i番目の製品がもつ機能をj番目の製品が持っていなかったらダメ
            }
            if(P[i]>P[j]) cond3=true;
            for(int k=0;k<M;k++){
                if(func[j][k] && !func[i][k]) cond3=true; //j番目の製品がi番目の製品にない機能をもっていたらOK
            }
            if(cond1 && cond2 && cond3) ans=true;
        }
    }
    if(ans==true) cout << "Yes" << endl;
    else cout << "No" << endl;
}

投稿日時:
最終更新: