Submission #380341

#TimeUsernameProblemLanguageResultExecution timeMemory
380341ngpin04Bitaro’s Party (JOI18_bitaro)C++14
100 / 100
1779 ms218472 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
using namespace std;
const int N = 1e5 + 5;
const int T = 200;

vector <pair <int, int>> best[N];
vector <int> adj[N];

int dp[N];
int n,m,q;

bool vis[N];
bool tmp[N];
 
vector <pair <int, int>> join(const vector <pair <int, int>> &a, const vector <pair <int, int>> &b) {
	vector <pair <int, int>> res;

	for (int i = 0, j = 0; res.size() < T && (i < a.size() || j < b.size());) {
		if (i == a.size() || (j < b.size() && a[i] < b[j])) {
			if (!tmp[b[j].se]) {
				res.push_back(b[j]);
				tmp[b[j].se] = true;
			}
			j++;
		} else {
			if (!tmp[a[i].se]) {
				res.push_back(a[i]);
				tmp[a[i].se] = true;
			}
			i++;
		} 
	}
	for (auto p : res) 
		tmp[p.se] = false;
	return res;
}

void dfs(int u) {
	best[u].push_back(mp(0, u));
	vis[u] = true;
	for (int v : adj[u]) {
		if (!vis[v])
			dfs(v);
		vector <pair <int, int>> b = best[v];
		for (auto &p : b)
			p.fi++;
		best[u] = join(best[u], b);
	}
}

int calc(int u) {
	int &res = dp[u];
	if (res != -1)
		return res;
	res = vis[u] ? -1e9 : 0;
	for (int v : adj[u])
		res = max(res, calc(v) + 1);
	return res;
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	cin >> n >> m >> q;
	for (int i = 1; i <= m; i++) {
		int u,v;
		cin >> u >> v;
		adj[v].push_back(u);
	}

	for (int i = 1; i <= n; i++)
		if (!vis[i])
			dfs(i);

	memset(vis, 0, sizeof(vis));

	while (q--) {
		int u,sz;
		cin >> u >> sz;
		vector <int> node(sz);
		for (int &x : node)
			cin >> x;

		for (int x : node)
			vis[x] = true;
		if (node.size() < T) {
			bool ok = false;
			for (auto p : best[u]) if (!vis[p.se]) {
				cout << p.fi << "\n";
				ok = true;
				break;
			}
			if (!ok)
				cout << -1 << "\n"; 
		} else {
			memset(dp, -1, sizeof(dp));
			int ans = calc(u);
			if (ans < 0)
				cout << -1 << "\n";
			else
				cout << ans << "\n";
		}
		
		for (int x : node)
			vis[x] = false;
	}
	return 0;
}

Compilation message (stderr)

bitaro.cpp: In function 'std::vector<std::pair<int, int> > join(const std::vector<std::pair<int, int> >&, const std::vector<std::pair<int, int> >&)':
bitaro.cpp:21:46: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   21 |  for (int i = 0, j = 0; res.size() < T && (i < a.size() || j < b.size());) {
      |                                            ~~^~~~~~~~~~
bitaro.cpp:21:62: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   21 |  for (int i = 0, j = 0; res.size() < T && (i < a.size() || j < b.size());) {
      |                                                            ~~^~~~~~~~~~
bitaro.cpp:22:9: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   22 |   if (i == a.size() || (j < b.size() && a[i] < b[j])) {
      |       ~~^~~~~~~~~~~
bitaro.cpp:22:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   22 |   if (i == a.size() || (j < b.size() && a[i] < b[j])) {
      |                         ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...