답안 #767227

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
767227 2023-06-26T14:20:58 Z APROHACK 장난감 기차 (IOI17_train) C++14
5 / 100
2000 ms 1512 KB
#include "train.h"
#include<bits/stdc++.h>
#define pb push_back
#define ll long long
#define ff first
#define ss second
#define past 2
#define ancestor 1
#define unvisited 0
using namespace std;
int n;
vector<bool>owner, charging;
vector<int>adj[5001];
bool isCycle[5001][2] ; // 0 Negative 1 Positive

short int vis[5001];
vector<int>nodos;
void memss(){
	for(int i = 0 ; i < n ; i ++)vis[i] = 0;
}

bool dfs(int node){
	////cout << "were " << node << endl;
	bool isA = owner[node];
	bool isCharging = charging[node];
	vis[node] = 1;
	nodos.pb(node);
	
	for(int i = 0 ; i < adj[node].size() ; i ++){
		if(!vis[adj[node][i]]){
			if(dfs(adj[node][i]) == isA){
				nodos.pop_back();
				vis[node] = 0;
				return isA;
			}
		}else{
			bool hayC = false;
			for(int j = nodos.size()-1 ; j>= 0 ; j --){
				if(charging[nodos[j]])hayC = true;
				if(nodos[j] == adj[node][i])break;
			}
			if((hayC && isA) or (!hayC && !isA)){
				nodos.pop_back();
				vis[node] = 0;
			}
			if(hayC && isA)return true;
			else if(!hayC && !isA)return false;
		}
	}
	nodos.pop_back();
	vis[node] = 0;
	return !isA;
}

void recorrer(int node){
	vis[node] = ancestor;
	nodos.pb(node);
	for(int i = 0 ; i < adj[node].size() ; i ++){
		if(vis[adj[node][i]] == past)continue;
		if(vis[adj[node][i]] == ancestor){
			bool positive = false;
			for(int j = nodos.size()-1 ; j >= 0 ; j --){
				if(charging[nodos[j]]){
					positive = true;
					break;
				}
				if(nodos[j] == adj[node][i])break;
			}
			for(int j = nodos.size() - 1 ; j >= 0 ; j --){
				if(positive)isCycle[nodos[j]][1] = true;
				else isCycle[nodos[j]][0] = true;
			}
		}else{
			recorrer(adj[node][i]);
		}
	}
	vis[node] = past;
	nodos.pop_back();
}

bool dfs2(int node){
	bool isA = owner[0];
	if(isA and isCycle[node][1])return true;
	if(!isA and isCycle[node][0])return false;
	vis[node] = past;
	for(int i = 0 ; i < adj[node].size() ; i ++){
		if(vis[adj[node][i] ] == past)continue;
		if(dfs2(adj[node][i]) == isA)return isA;
	}
	return !isA;
}

std::vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> u, std::vector<int> v) {
	n = a.size();
	vector<int> res;
	memss();
	bool all1 = true, all0 = true;
	for(int i = 0 ; i < n ; i ++){
		owner.pb(a[i]);
		res.pb(0);
		charging.pb(r[i]);
		if(a[i] == 0)all1 = false;
		else all0 = false;
	}
	for(int i = 0 ; i < u.size() ; i ++){
		adj[u[i]].pb(v[i]);
	}
	if(all0 or all1){
		for(int i = 0 ; i < n ; i ++){
			if(vis[i] == unvisited)recorrer(i);
		}
		memss();
		for(int i = 0 ; i < n ; i ++){
			if(dfs2(i)){
				res[i] = 1;
			}else res[i] = 0;
			
		}
	}else{
		for(int i = 0 ; i < n ; i ++){
			if(dfs(i)){
				res[i] = 1;
			}else res[i] = 0;
			
		}
	}
	return res;
}

Compilation message

train.cpp: In function 'bool dfs(int)':
train.cpp:29:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |  for(int i = 0 ; i < adj[node].size() ; i ++){
      |                  ~~^~~~~~~~~~~~~~~~~~
train.cpp:25:7: warning: unused variable 'isCharging' [-Wunused-variable]
   25 |  bool isCharging = charging[node];
      |       ^~~~~~~~~~
train.cpp: In function 'void recorrer(int)':
train.cpp:58:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   58 |  for(int i = 0 ; i < adj[node].size() ; i ++){
      |                  ~~^~~~~~~~~~~~~~~~~~
train.cpp: In function 'bool dfs2(int)':
train.cpp:86:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |  for(int i = 0 ; i < adj[node].size() ; i ++){
      |                  ~~^~~~~~~~~~~~~~~~~~
train.cpp: In function 'std::vector<int> who_wins(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
train.cpp:105:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  105 |  for(int i = 0 ; i < u.size() ; i ++){
      |                  ~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 724 KB Output is correct
2 Correct 4 ms 764 KB Output is correct
3 Correct 4 ms 724 KB Output is correct
4 Correct 5 ms 724 KB Output is correct
5 Correct 4 ms 724 KB Output is correct
6 Correct 4 ms 724 KB Output is correct
7 Correct 3 ms 724 KB Output is correct
8 Correct 3 ms 724 KB Output is correct
9 Correct 3 ms 724 KB Output is correct
10 Correct 3 ms 724 KB Output is correct
11 Correct 3 ms 724 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 0 ms 340 KB Output is correct
8 Correct 0 ms 340 KB Output is correct
9 Correct 0 ms 340 KB Output is correct
10 Correct 0 ms 340 KB Output is correct
11 Correct 1 ms 340 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
13 Incorrect 1 ms 340 KB 3rd lines differ - on the 11th token, expected: '1', found: '0'
14 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 1236 KB Output is correct
2 Correct 8 ms 1496 KB Output is correct
3 Correct 6 ms 1364 KB Output is correct
4 Incorrect 14 ms 1512 KB 3rd lines differ - on the 4965th token, expected: '1', found: '0'
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 1108 KB Output is correct
2 Incorrect 5 ms 1108 KB 3rd lines differ - on the 48th token, expected: '0', found: '1'
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2069 ms 1108 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 724 KB Output is correct
2 Correct 4 ms 764 KB Output is correct
3 Correct 4 ms 724 KB Output is correct
4 Correct 5 ms 724 KB Output is correct
5 Correct 4 ms 724 KB Output is correct
6 Correct 4 ms 724 KB Output is correct
7 Correct 3 ms 724 KB Output is correct
8 Correct 3 ms 724 KB Output is correct
9 Correct 3 ms 724 KB Output is correct
10 Correct 3 ms 724 KB Output is correct
11 Correct 3 ms 724 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
13 Correct 1 ms 340 KB Output is correct
14 Correct 1 ms 340 KB Output is correct
15 Correct 1 ms 340 KB Output is correct
16 Correct 1 ms 340 KB Output is correct
17 Correct 1 ms 340 KB Output is correct
18 Correct 0 ms 340 KB Output is correct
19 Correct 0 ms 340 KB Output is correct
20 Correct 0 ms 340 KB Output is correct
21 Correct 0 ms 340 KB Output is correct
22 Correct 1 ms 340 KB Output is correct
23 Correct 1 ms 340 KB Output is correct
24 Incorrect 1 ms 340 KB 3rd lines differ - on the 11th token, expected: '1', found: '0'
25 Halted 0 ms 0 KB -