Submission #287848

#TimeUsernameProblemLanguageResultExecution timeMemory
287848MercenaryToy Train (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...