Submission #908663

#TimeUsernameProblemLanguageResultExecution timeMemory
908663mickey080929Bitaro’s Party (JOI18_bitaro)C++17
14 / 100
502 ms245844 KiB
#include <bits/stdc++.h>

using namespace std;

const int B = 300;

int dp[100010][B+1];
int st[100010][B+1];
vector<int> adj[100010];
int idx[100010];
int chk[100010];
int dp2[100010];

int main() {
	int n, m, q;
	cin >> n >> m >> q;
	for (int i=0; i<m; i++) {
		int u, v;
		cin >> u >> v;
		adj[v].push_back(u);
	}
	memset(dp, -1, sizeof(dp));
	for (int i=1; i<=n; i++) {
		for (auto &j : adj[i]) {
			idx[j] = 0;
		}
		for (int j=0; j<B; j++) {
			int mx = -1, pv = -1;
			for (auto &k : adj[i]) {
				if (mx < dp[k][idx[k]]) {
					mx = dp[k][idx[k]];
					pv = k;
				}
			}
			if (pv == -1) break;
			dp[i][j] = mx + 1;
			st[i][j] = st[pv][idx[pv]];
			idx[pv] ++;
		}
		for (int j=0; j<B; j++) {
			if (dp[i][j] == -1) {
				dp[i][j] = 0;
				st[i][j] = i;
				break;
			}
		}
	}
	while (q --) {
		int x;
		cin >> x;
		int k;
		cin >> k;
		vector<int> num(k);
		for (int i=0; i<k; i++) {
			cin >> num[i];
			chk[num[i]] = 1;
		}
		if (k < B) {
			for (int i=0; i<B; i++) {
				if (!chk[st[x][i]]) {
					cout << dp[x][i] << '\n';
					break;
				}
			}
		}
		else {
			memset(dp2, -1, sizeof(dp2));
			for (int i=1; i<=x; i++) {
				if (!chk[i]) dp2[i] = 0;
				for (auto &j : adj[i]) {
					if (dp2[j] != -1)
						dp2[i] = max(dp2[i], dp2[j] + 1);
				}
			}
			cout << dp2[x] << '\n';
		}
		for (int i=0; i<k; i++) {
			chk[num[i]] = 0;
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...