제출 #287848

#제출 시각아이디문제언어결과실행 시간메모리
287848Mercenary장난감 기차 (IOI17_train)C++14
100 / 100
585 ms1784 KiB
#include "train.h"
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/trie_policy.hpp>

#define pb push_back
#define mp make_pair
#define taskname "A"

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;
typedef pair<int,int> ii;
typedef tree <int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;

const int maxn = 5e3 + 5;
const int mod = 1e9 + 7;

std::vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> u, std::vector<int> v){
    int n = a.size() , m = u.size();
    vector<vector<int>> adj(m,vector<int>(0));
    vector<int> res(n , -1);
    vector<int> deg(n , 0);
    for(int i = 0 ; i < m ; ++i){
        deg[u[i]]++;
        adj[v[i]].pb(u[i]);
    }
    vector<int> cnt(n , 0);
    while(true){
        fill(cnt.begin(),cnt.end(),0);
        queue<int> q;
        auto check = [&](int u , int col){
            return cnt[u] >= (a[u] ^ col ? deg[u] : 1);
        };
        for(int i = 0 ; i < n ; ++i){
            if(res[i] == -1 && (r[i] || check(i , 1))){
                res[i] = 1;
                q.push(i);
            }
        }
        auto bfs = [&](int col){
            while(q.size()){
                int u = q.front();q.pop();
//                cout << u << endl;
                for(auto & c : adj[u]){
                    cnt[c]++;
                    if(res[c] == -1 && check(c , col)){
                        res[c] = col;
                        q.push(c);
                    }
                }
            }
        };
        bfs(1);
//        for(int i = 0 ; i < n ; ++i)cout << res[i] << " ";cout << endl;
        if(*min_element(res.begin(),res.end()) >= 0)return res;
        fill(cnt.begin(),cnt.end(),0);
        for(int i = 0 ; i < n ; ++i){
            if(res[i] == 1){
                res[i] = -1;
            }else{
                res[i] = 0;
                for(auto & c : adj[i]){
                    cnt[c]++;
                }
            }
        }
        for(int i = 0 ; i < n ; ++i){
            if(res[i] == -1 && check(i , 0)){
                q.push(i);
                res[i] = 0;
            }
        }
        bfs(0);
    }
    return res;
}

#ifdef LOCAL
#include "train.h"

#include <cstdio>
#include <vector>
#include <cassert>

using namespace std;

int main() {
	int n, m;
	assert(2 == scanf("%d %d", &n, &m));

	vector<int> a(n), r(n), u(m), v(m);

	for(int i = 0; i < n; i++)
		assert(1 == scanf("%d", &a[i]));

	for(int i = 0; i < n; i++)
		assert(1 == scanf("%d", &r[i]));

	for(int i = 0; i < m; i++)
		assert(2 == scanf("%d %d", &u[i], &v[i]));

	vector<int> res = who_wins(a, r, u, v);

	for(int i = 0; i < (int)res.size(); i++)
		printf(i ? " %d" : "%d", res[i]);
	printf("\n");

	return 0;
}
#endif // LOCAL
#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...