PKU 1029 False coin

False coin

i番目のコインが偽者と仮定して、計量の結果と矛盾が無いか調べる。矛盾の無いコインがちょうど1枚ならば、そのコインが偽者。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool contain( vector<int> v, int c )
{
    return find( v.begin(), v.end(), c ) != v.end();
}

int main()
{
    int N, K;  cin >> N >> K;

    vector<vector<int> > left(K);
    vector<vector<int> > right(K);
    vector<char> result(K);
    for ( int i=0; i<K; i++ )
    {
        int n;  cin >> n;
        left[i].resize(n);
        right[i].resize(n);
        for ( int j=0; j<n; j++ )
            cin >> left[i][j];
        for ( int j=0; j<n; j++ )
            cin >> right[i][j];
        cin >> result[i];
    }

    vector<int> falsecoin;

    for ( int c=1; c<=N; c++ )
    for ( int w=-1; w<=1; w+=2 )
    {
        bool f = true;

        for ( int i=0; i<K; i++ )
            if ( result[i]=='<' && w<0 && !contain(left [i],c) ||
                 result[i]=='<' && w>0 && !contain(right[i],c) ||
                 result[i]=='>' && w<0 && !contain(right[i],c) ||
                 result[i]=='>' && w>0 && !contain(left [i],c) ||
                 result[i]=='=' &&         contain(left [i],c) ||
                 result[i]=='=' &&         contain(right[i],c) )
                f = false;

        if ( f  &&  ! contain(falsecoin,c) )
            falsecoin.push_back( c );   
    }

    cout << ( falsecoin.size()==1 ? falsecoin[0] : 0 ) << endl;

    return 0;
}