Submission #1345828

#TimeUsernameProblemLanguageResultExecution timeMemory
1345828gkos5678Ili (COI17_ili)C++20
49 / 100
4096 ms50728 KiB
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define ppb pop_back

typedef vector<int> vi;

const int maxn = 1e4 + 7;

int n, m, tri, np[maxn], s1[maxn], s2[maxn];
bool vis[maxn], in[maxn][maxn];
char ans[maxn];
string c;

void dfs(int v){
    if (v <= n){
        np[tri] += 1 - in[tri][v];
        in[tri][v] = 1;
        return;
    }
    v -= n;
    if (vis[v]) return;
    vis[v] = 1;
    dfs(s1[v]);
    dfs(s2[v]);
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    cin >> n >> m >> c;
    c = "$" + c;
    for (int i = 1; i <= n; i++)
        ans[i] = '?';
    for (int i = 1; i <= m; i++){
        char c1, c2;
        int u, v;
        cin >> c1 >> u >> c2 >> v;
        s1[i] = (c1 == 'c') * n + u;
        s2[i] = (c2 == 'c') * n + v;
    }

    for (int i = 1; i <= m; i++){
        for (int j = 1; j <= m; j++)
            vis[j] = 0;
        tri = i;
        dfs(i + n);
    }
    for (int i = 1; i <= m; i++){
        if (c[i] != '0') continue;
        for (int j = 1; j <= n; j++){
            if (!in[i][j] || ans[j] == '0')
                continue;
            ans[j] = '0';
            for (int k = 1; k <= m; k++)
                np[k] -= in[k][j];
        }
    }
    for (int i = 1; i <= m; i++){
        if (c[i] != '1' || np[i] != 1)
            continue;
        int neod = -1;
        bool all0 = 1;
        for (int j = 1; j <= n; j++){
            if (!in[i][j]) continue;
            if (ans[j] == '1'){
                all0 = 0;
                break;
            }
            if (ans[j] == '?')
                neod = j;
        }
        if (!all0) continue;
        ans[neod] = '1';
    }

    for (int i = 1; i <= m; i++){
        if (c[i] != '?') continue;
        bool im1 = 0, nmu = 1;
        for (int j = 1; j <= n; j++){
            if (!in[i][j]) continue;
            im1 |= (ans[j] == '1');
            nmu &= (ans[j] != '?');
        }
        if (im1) c[i] = '1';
        else if (nmu) c[i] = '0';
    }
    for (int i = 1; i <= m; i++){
        if (c[i] != '?') continue;
        for (int j = 1; j <= m; j++){
            if (c[j] != '1') continue;
            bool b = 1;
            for (int k = 1; k <= n; k++){
                if (!in[j][k]) continue;
                b &= (in[i][k] || ans[k] == '0');
            }
            if (b){
                c[i] = '1';
                break;
            }
        }
    }
    for (int i = 1; i <= m; i++)
        cout << c[i];
    cout << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...