Submission #466109

#TimeUsernameProblemLanguageResultExecution timeMemory
466109SirCovidThe19thIli (COI17_ili)C++17
100 / 100
1167 ms1476 KiB
#include <bits/stdc++.h>
using namespace std; 

int n, m; vector<char> A; vector<int> in[20005];

void set0(vector<char> &X, int i){
    X[i] = '0'; 
    for (auto nxt : in[i]) if (X[nxt] != '0') set0(X, nxt);
}
bool can(vector<char> &X){
    for (int i = n; i < n + m; i++){
        char &in1 = X[in[i][0]], &in2 = X[in[i][1]], &cur = X[i];
        if (in1 == '0' and in2 == '0') cur = '0';
        else if (in1 == '1' or in2 == '1') cur = '1';
        if (A[i] != '?' and cur != A[i]) return 0;
    }
    return 1;
}

int main(){
    cin >> n >> m; A.resize(n + m);

    for (int i = 0; i < n + m; i++){
        if (i < n) A[i] = '?';
        else cin >> A[i];
    }
    for (int i = n, u, v; i < n + m; i++){
        string a, b; cin >> a >> b;
        u = stoi(a.substr(1)) + (a[0] == 'c' ? n : 0);
        v = stoi(b.substr(1)) + (b[0] == 'c' ? n : 0);
        in[i].push_back(u - 1); in[i].push_back(v - 1);
    }
    for (int i = n; i < n + m; i++) if (A[i] == '0') set0(A, i);
    
    for (int i = n; i < n + m; i++){
        if (A[i] == '?'){
            vector<char> tmp0 = A, tmp1 = A; bool ok0, ok1;
            set0(tmp0, i); tmp1[i] = '1';
            A[i] = '0'; ok0 = can(tmp0);
            A[i] = '1'; ok1 = can(tmp1);
            A[i] = '?'; 
            cout<<((ok0 and ok1) ? "?" : to_string(ok1));
        }
        else cout<<A[i];
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...