답안 #827334

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
827334 2023-08-16T11:18:41 Z tranxuanbach 장난감 기차 (IOI17_train) C++17
16 / 100
7 ms 2004 KB
#include "train.h"

#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define For(i, l, r) for (auto i = (l); i < (r); i++)
#define ForE(i, l, r) for (auto i = (l); i <= (r); i++)
#define FordE(i, l, r) for (auto i = (l); i >= (r); i--)
#define bend(a) (a).begin(), (a).end()
#define isz(a) ((int)(a).size())

struct edge_t{
	int from, to;
};

const int N = 5e3 + 5, M = 2e4 + 5;

int n, m;
int a[N]; // true = A, false = B
bool b[N]; // is charging station
edge_t edge[M];
vector <int> adj[N], radj[N];
bool has_self_loop[N];

namespace subtask1{
	bool check(){
		For(i, 0, m){
			if (not (edge[i].from == edge[i].to or edge[i].from + 1 == edge[i].to)){
				return false;
			}
		}
		return true;
	}

	vector <int> solve(){
		vector <bool> has_next_edge(n, false);
		For(i, 0, m){
			if (edge[i].from + 1 == edge[i].to){
				has_next_edge[edge[i].from] = true;
			}
		}
		vector <int> ans(n);
		ans[n - 1] = b[n - 1];
		FordE(u, n - 2, 0){
			if (not has_self_loop[u]){
				ans[u] = ans[u + 1];
				continue;
			}
			if (a[u] and (b[u] or (has_next_edge[u] and ans[u + 1]))){
				ans[u] = a[u];
			}
			else if (not a[u] and (not b[u] or (has_next_edge[u] and not ans[u + 1]))){
				ans[u] = a[u];
			}
			else{
				ans[u] = a[u] ^ 1;
			}
		}
		return ans;
	}
}

namespace subtask3{
	bool check(){
		return *min_element(a, a + n) == 1;
	}

	vector <int> vis;
	vector <int> order;
	vector <int> cpn;
	vector <vector <int>> scc;

	void dfs_topo(int u){
		vis[u] = true;
		for (auto i: adj[u]){
			int v = edge[i].to;
			if (not vis[v]){
				dfs_topo(v);
			}
		}
		order.emplace_back(u);
	}

	void dfs_cpn(int u){
		vis[u] = true;
		cpn.emplace_back(u);
		for (auto i: radj[u]){
			int v = edge[i].from;
			if (not vis[v]){
				dfs_cpn(v);
			}
		}
	}

	vector <int> solve(){
		vis.assign(n, false);
		For(u, 0, n){
			if (not vis[u]){
				dfs_topo(u);
			}
		}
		reverse(bend(order));
		vis.assign(n, false);
		for (auto u: order){
			if (vis[u]){
				continue;
			}
			cpn.clear();
			dfs_cpn(u);
			scc.emplace_back(cpn);
		}
		reverse(bend(scc));
		vector <int> ans(n, false);
		for (auto &cpn: scc){
			bool has_b = false, ok = false;
			for (auto u: cpn){
				if (b[u]){
					has_b = true;
				}
				for (auto i: adj[u]){
					int v = edge[i].to;
					if (ans[v]){
						ok = true;
					}
				}
			}
			if (has_b){
				if (isz(cpn) >= 2){
					ok = true;
				}
				for (auto u: cpn){
					if (has_self_loop[u]){
						ok = true;
					}
				}
			}
			for (auto u: cpn){
				ans[u] = ok;
			}
		}
		return ans;
	}
}

namespace subtask4{
	bool check(){
		return *max_element(a, a + n) == 0;
	}

	vector <bool> vis;
	vector <int> order;
	vector <int> cpn;
	vector <vector <int>> scc;

	void dfs_topo(int u){
		vis[u] = true;
		for (auto i: adj[u]){
			int v = edge[i].to;
			if (not vis[v]){
				dfs_topo(v);
			}
		}
		order.emplace_back(u);
	}

	void dfs_cpn(int u){
		vis[u] = true;
		cpn.emplace_back(u);
		for (auto i: radj[u]){
			int v = edge[i].from;
			if (not vis[v]){
				dfs_cpn(v);
			}
		}
	}

	vector <int> solve(){
		vis = vector <bool>(b, b + n);
		For(u, 0, n){
			if (not vis[u]){
				dfs_topo(u);
			}
		}
		reverse(bend(order));
		vis = vector <bool>(b, b + n);
		for (auto u: order){
			if (vis[u]){
				continue;
			}
			cpn.clear();
			dfs_cpn(u);
			scc.emplace_back(cpn);
		}
		reverse(bend(scc));
		vector <int> ans(n, false);
		queue <int> qu;
		for (auto &cpn: scc){
			if (isz(cpn) >= 2 or has_self_loop[cpn.back()]){
				for (auto u: cpn){
					ans[u] = true;
					qu.emplace(u);
				}
			}
		}
		while (not qu.empty()){
			int u = qu.front(); qu.pop();
			for (auto i: radj[u]){
				int v = edge[i].from;
				if (not ans[v]){
					ans[v] = true;
					qu.emplace(v);
				}
			}
		}
		return ans;
	}
}

vector <int> who_wins(vector <int> _a, vector <int> _r, vector <int> _u, vector <int> _v){
	n = isz(_a); m = isz(_u);
	For(u, 0, n){
		a[u] = _a[u];
		b[u] = _r[u];
	}
	For(i, 0, m){
		int u = _u[i], v = _v[i];
		edge[i] = edge_t{u, v};
		adj[u].emplace_back(i);
		radj[v].emplace_back(i);
	}

	For(i, 0, m){
		auto [u, v] = edge[i];
		if (u == v){
			has_self_loop[u] = true;
		}
	}
	if (subtask1::check()){
		return subtask1::solve();
	}
	if (subtask3::check()){
		return subtask3::solve();
	}
	if (subtask4::check()){
		return subtask4::solve();
	}
	return vector <int>(n);
}
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 1108 KB Output is correct
2 Correct 3 ms 1108 KB Output is correct
3 Correct 3 ms 1108 KB Output is correct
4 Correct 3 ms 1024 KB Output is correct
5 Correct 3 ms 1108 KB Output is correct
6 Correct 3 ms 1108 KB Output is correct
7 Correct 3 ms 1108 KB Output is correct
8 Correct 3 ms 1108 KB Output is correct
9 Correct 3 ms 1108 KB Output is correct
10 Correct 3 ms 980 KB Output is correct
11 Correct 2 ms 980 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 468 KB 3rd lines differ - on the 2nd token, expected: '1', found: '0'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 2004 KB Output is correct
2 Correct 5 ms 1876 KB Output is correct
3 Correct 6 ms 1876 KB Output is correct
4 Correct 7 ms 1748 KB Output is correct
5 Correct 6 ms 1748 KB Output is correct
6 Correct 7 ms 1648 KB Output is correct
7 Correct 6 ms 1620 KB Output is correct
8 Correct 6 ms 1620 KB Output is correct
9 Correct 6 ms 1620 KB Output is correct
10 Correct 6 ms 1492 KB Output is correct
11 Correct 6 ms 1600 KB Output is correct
12 Correct 6 ms 1728 KB Output is correct
13 Correct 6 ms 1876 KB Output is correct
14 Correct 7 ms 1748 KB Output is correct
15 Correct 6 ms 1776 KB Output is correct
16 Correct 6 ms 1764 KB Output is correct
17 Correct 6 ms 1836 KB Output is correct
18 Correct 4 ms 1620 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 1364 KB 3rd lines differ - on the 1st token, expected: '1', found: '0'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 1492 KB 3rd lines differ - on the 1st token, expected: '1', found: '0'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 1108 KB Output is correct
2 Correct 3 ms 1108 KB Output is correct
3 Correct 3 ms 1108 KB Output is correct
4 Correct 3 ms 1024 KB Output is correct
5 Correct 3 ms 1108 KB Output is correct
6 Correct 3 ms 1108 KB Output is correct
7 Correct 3 ms 1108 KB Output is correct
8 Correct 3 ms 1108 KB Output is correct
9 Correct 3 ms 1108 KB Output is correct
10 Correct 3 ms 980 KB Output is correct
11 Correct 2 ms 980 KB Output is correct
12 Incorrect 0 ms 468 KB 3rd lines differ - on the 2nd token, expected: '1', found: '0'
13 Halted 0 ms 0 KB -