답안 #56570

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
56570 2018-07-11T18:08:46 Z FLDutchman 장난감 기차 (IOI17_train) C++14
0 / 100
2000 ms 99832 KB
#include "train.h"
#include "bits/stdc++.h"
#define FOR(i, l, r) for(int i = (l); i < (r); i++)
#define pb push_back
using namespace std;
typedef vector<int> vi;
const int NMAX = 5010;

int N, M;
vi kind, isCharging;
vi adj[NMAX], iadj[NMAX];
bitset<NMAX> vis;
vi outdeg;

void dfs(int n){
	vis[n] = 1;
	for(int k : iadj[n]) if(!vis[k]) {
		if(kind[k] == 1 || outdeg[k] == 1) dfs(k);
		else outdeg[k]--;
	}
}

vi reaches(vi start){
	vi copy = outdeg;
	vis.reset();
	for(int n : start) if(!vis[n]) dfs(n);
	outdeg = copy;
	vi ret;
	FOR(i, 0, N) if(vis[i]) ret.pb(i);
	return ret;
}

int g[NMAX][NMAX];
vi who_wins(vi a, vi r, vi u, vi v) {
	//cout<<"Called"<<endl;
	kind = a;
	isCharging = r;
	N = a.size();
	M = u.size();
	outdeg.assign(N, 0);
	//cout<<"starting"<<endl;
	FOR(i, 0, u.size()){
		adj[u[i]].pb(v[i]);
		outdeg[u[i]]++;
		iadj[v[i]].pb(u[i]);
	}
	//cout<<1<<endl;
	memset(g, 0, NMAX*NMAX);
	//cout<<"a "<<endl;
	FOR(i, 0, N) {
		vi t = reaches({i});
		for(int j : t) g[i][j] = 1;
	}
	vi start;
	//FOR(i, 0, N) {
		//FOR(j, 0, N)cout<<g[i][j]<<" ";
		//cout<<endl;
	//} 
	FOR(i, 0, N) if(isCharging[i]) FOR(j, 0, N) {
		if(g[i][j] and g[j][i]) {
			start.pb(i);
			break;
		}
	}
	//cout << "start: " << endl;
	//for(int s : start) cout << s << " ";
	//cout<<endl;
	//cout<<"Declaring ret"<<endl;
	vi ret(N, 0);
	vi out = reaches(start);
	for(int k : out) ret[k] = 1;
	//cout<<"returning"<<endl;
	return ret;
}

/*
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;
}


/*
2 4
0 1
1 0
0 0
0 1
1 0
1 1

7 11
1 0 0 0 0 0 0
1 0 0 0 0 0 0
0 4
0 5
1 0
1 3
1 2
2 1
2 3
3 0
4 0
5 6
6 6

*/

Compilation message

train.cpp:102:1: warning: "/*" within comment [-Wcomment]
 /*
  
train.cpp: In function 'vi who_wins(vi, vi, vi, vi)':
train.cpp:3:41: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i, l, r) for(int i = (l); i < (r); i++)
                                         ^
train.cpp:42:2: note: in expansion of macro 'FOR'
  FOR(i, 0, u.size()){
  ^~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 136 ms 40952 KB 3rd lines differ - on the 1st token, expected: '0', found: '1'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 20 ms 40952 KB 3rd lines differ - on the 1st token, expected: '0', found: '1'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 704 ms 99832 KB 3rd lines differ - on the 1st token, expected: '0', found: '1'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 157 ms 99832 KB 3rd lines differ - on the 696th token, expected: '0', found: '1'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 160 ms 99832 KB Output is correct
2 Execution timed out 2062 ms 99832 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 136 ms 40952 KB 3rd lines differ - on the 1st token, expected: '0', found: '1'
2 Halted 0 ms 0 KB -