Submission #372478

#TimeUsernameProblemLanguageResultExecution timeMemory
372478dooweyToy Train (IOI17_train)C++14
100 / 100
1568 ms1772 KiB
#include <bits/stdc++.h>
#include "train.h"

using namespace std;

typedef pair<int, int> pii;
typedef long long ll;

#define fi first
#define se second
#define mp make_pair

const int N = 5010;
bool ban[N];
bool inq[N];
int n, m;
vector<int> a;
vector<int> r;
vector<int> u;
vector<int> v;

vector<int> in[N];
int deg[N];

vector<int> f(int bit, vector<int> init){
    for(int i = 0 ; i < n; i ++ ){
        inq[i]=false;
        in[i].clear();
        deg[i]=0;
    }
    queue<int> ads;
    for(auto x : init){
        ads.push(x);
        inq[x]=true;
    }
    for(int i =0  ; i < m ; i ++ ){
        if(!ban[u[i]] && !ban[v[i]]){
            in[v[i]].push_back(u[i]);
            deg[u[i]] ++ ;
        }
    }
    for(int i = 0 ; i < n; i ++ ){
        if(a[i] == bit) deg[i]=1;
    }
    int node;
    while(!ads.empty()){
        node = ads.front();
        ads.pop();
        for(auto x : in[node]){
            if(inq[x]) continue;
            deg[x]--;
            if(deg[x] == 0){
                ads.push(x);
                init.push_back(x);
                inq[x]=true;
            }
        }
    }
    return init;
}

vector<int> sol;
int has[N];

vector<int> who_wins(vector<int> _a, vector<int> _r, vector<int> _u, vector<int> _v) {
    a = _a;
    r = _r;
    u = _u;
    v = _v;
    n = _a.size();
    m = u.size();
    bool ok;
    sol.resize(n);
    int rem = 0;
    while(1){
        ok = false;
        vector<int> start;
        rem = 0;
        for(int i = 0 ; i < n; i ++ ){
            if(r[i] && !ban[i]) start.push_back(i);
            if(!ban[i]){
                rem ++ ;
            }
            has[i]=false;
        }
        if(start.empty()){
            for(int i = 0 ; i < n; i ++ ){
                if(!ban[i]){
                    ban[i]=true;
                    sol[i]=0;
                }
            }
            break;
        }
        start = f(1, start);
        for(auto x : start) has[x]=true;
        if(start.size() == rem){
            for(int i = 0 ; i < n; i ++ ){
                if(!ban[i]){
                    sol[i]=1;
                    ban[i]=true;
                }
            }
            break;
        }
        vector<int> nw;
        for(int i = 0 ; i < n; i ++ ){
            if(!ban[i] && !has[i]){
                nw.push_back(i);
            }
        }
        nw = f(0, nw);
        for(auto x : nw){
            sol[x]=0;
            ban[x]=true;
        }
    }
	return sol;
}

Compilation message (stderr)

train.cpp: In function 'std::vector<int> who_wins(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
train.cpp:97:25: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   97 |         if(start.size() == rem){
      |            ~~~~~~~~~~~~~^~~~~~
train.cpp:72:10: warning: variable 'ok' set but not used [-Wunused-but-set-variable]
   72 |     bool ok;
      |          ^~
#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...