Submission #535434

#TimeUsernameProblemLanguageResultExecution timeMemory
535434mario05092929장난감 기차 (IOI17_train)C++14
100 / 100
497 ms1476 KiB
#include "train.h"
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair <int,int> pi;
typedef vector <int> vec;
int s[5005],revs[5005],no[5005],n,m,ind[5005],ing[5005];
vec ans,v[5005];

vec who_wins(vec a,vec r,vec u1,vec u2) {
    n = a.size();
    m = u1.size();
    for(int i = 0;i < m;i++) {
        int y = u1[i], x = u2[i];
        v[x].push_back(y);
        ind[y]++;
    }
    for(int i = 0;i < n;i++) no[i] = r[i];
    queue <int> q;
    while(1) {
        memset(ing,0,sizeof(ing));
        for(int i = 0;i < n;i++) {
            if(no[i]) q.push(i);
            s[i] = no[i];
        }

        while(!q.empty()) {
            int x = q.front(); q.pop();
            for(int i : v[x]) {
                if(s[i]) continue;
                ing[i]++;
                if(!a[i]) {
                    if(ing[i] == ind[i]) {
                        s[i] = 1;
                        q.push(i);
                    }
                }
                else {
                    if(ing[i]) {
                        s[i] = 1;
                        q.push(i);
                    }
                }
            }
        }

        memset(ing,0,sizeof(ing));
        for(int i = 0;i < n;i++) {
            if(s[i]^1) q.push(i);
            revs[i] = s[i]^1;
        }

        while(!q.empty()) {
            int x = q.front(); q.pop();
            for(int i : v[x]) {
                if(revs[i]) continue;
                ing[i]++;
                if(a[i]) {
                    if(ing[i] == ind[i]) {
                        revs[i] = 1;
                        q.push(i);
                    }
                }
                else {
                    if(ing[i]) {
                        revs[i] = 1;
                        q.push(i);
                    }
                }
            }
        }
        int ch = 0;
        for(int i = 0;i < n;i++) {
            if(no[i]&&revs[i]) ch = 1, no[i] = 0;
        }
        if(!ch) break;
    }
    for(int i = 0;i < n;i++) {
        ans.push_back(revs[i]^1);
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...