답안 #618107

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
618107 2022-08-01T22:38:59 Z MohamedAhmed04 장난감 기차 (IOI17_train) C++14
0 / 100
2000 ms 2900 KB
#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] ;

void Construct_Graph()
{
	queue<int>q ;
	for(int i = 1 ; i <= n ; ++i)
	{
		mark[i] = 0 ;
		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])
		{
			if(arr[child] && (!mark[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(int i = 1 ; i <= n ; ++i)
	{
		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)
	{
		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[node]) || (!deg[node]))
			{
				ans[node] = 0 ;
				q.push(node) ;
			}
		}
	}
}

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]]++ , adj[u[i]].push_back(v[i]) , adj[v[i]].push_back(u[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 ;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1603 ms 1396 KB 3rd lines differ - on the 1st token, expected: '0', found: '1'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 724 KB 3rd lines differ - on the 1st token, expected: '0', found: '1'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2072 ms 2504 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 719 ms 1536 KB 3rd lines differ - on the 21st token, expected: '1', found: '0'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2071 ms 2900 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1603 ms 1396 KB 3rd lines differ - on the 1st token, expected: '0', found: '1'
2 Halted 0 ms 0 KB -