제출 #619295

#제출 시각아이디문제언어결과실행 시간메모리
619295MohamedAhmed04장난감 기차 (IOI17_train)C++17
10 / 100
2080 ms2488 KiB
#include "train.h" #include <bits/stdc++.h> using namespace std ; const int MAX = 5000 + 10 ; int arr[MAX] , mark[MAX] , charging[MAX] ; int n , m ; vector< vector<int> >adj(MAX) , adjr(MAX) ; vector< vector<int> >adj2(MAX) , adj2r(MAX) ; int vis[MAX] , ans[MAX] ; int deg[MAX] , deg2[MAX] ; void Construct_Graph() { queue<int>q ; for(int i = 1 ; i <= n ; ++i) { mark[i] = 0 , deg[i] = deg2[i] ; if(charging[i] && ans[i]) q.push(i) , mark[i] = 1 ; } while(!q.empty()) { int node = q.front() ; q.pop() ; for(auto &child : adjr[node]) { deg[child]-- ; if(mark[child]) continue ; if((arr[child]) || (!deg[child])) { mark[child] = 1 ; q.push(child) ; } } } for(int i = 1 ; i <= n ; ++i) { adj2[i].clear() , adj2r[i].clear() ; if(mark[i]) continue ; for(auto &child : adj[i]) { if(!mark[child]) { adj2[i].push_back(child) ; } } } } // don't forget self-loop vector<int>v , topo ; void dfs(int node) { vis[node] = 1 ; for(auto &child : adj2r[node]) { if(!vis[child]) dfs(child) ; } topo.push_back(node) ; } void dfs2(int node) { vis[node] = 1 ; v.push_back(node) ; for(auto &child : adj2[node]) { if(!vis[child]) dfs2(child) ; } } void Find_Cycles() { topo.clear() ; for(int i = 1 ; i <= n ; ++i) { for(auto &child : adj2[i]) adj2r[child].push_back(i) ; } memset(vis , 0 , sizeof(vis)) ; for(int i = 1 ; i <= n ; ++i) { if(!vis[i]) dfs(i) ; } reverse(topo.begin() , topo.end()) ; memset(vis , 0 , sizeof(vis)) ; for(auto &i : topo) { if(vis[i]) continue ; v.clear() ; dfs2(i) ; if(v.size() == 1) { for(auto &child : adj2[i]) { if(child == i) //self loop ans[i] = 0 ; } continue ; } for(auto &node : v) ans[node] = 0 ; } } void solve() { queue<int>q ; for(int i = 1 ; i <= n ; ++i) { deg[i] = deg2[i] ; if(!ans[i]) q.push(i) ; } while(!q.empty()) { int node = q.front() ; q.pop() ; for(auto &child : adjr[node]) { deg[child]-- ; if(!ans[child]) continue ; if((!arr[child]) || (!deg[child])) { ans[child] = 0 ; q.push(child) ; } } } } std::vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> u, std::vector<int> v) { n = a.size() , m = u.size() ; for(int i = 1 ; i <= n ; ++i) ans[i] = 1 , arr[i] = a[i-1] , charging[i] = r[i-1] ; for(int i = 0 ; i < m ; ++i) deg[u[i]+1]++ , adj[u[i]+1].push_back(v[i]+1) , adjr[v[i]+1].push_back(u[i]+1) ; for(int i = 1 ; i <= n ; ++i) deg2[i] = deg[i] ; for(int _ = 0 ; _ < n ; ++_) { Construct_Graph() ; Find_Cycles() ; solve() ; } vector<int>ans2 ; for(int i = 1 ; i <= n ; ++i) ans2.push_back(ans[i]) ; return ans2 ; }
#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...