Submission #1221426

#TimeUsernameProblemLanguageResultExecution timeMemory
1221426siewjhBitaro’s Party (JOI18_bitaro)C++20
100 / 100
1322 ms411128 KiB
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
const int inf = 1e9 + 7;
vector<int> radj[MAXN];
vector<pair<int, int>> best[MAXN];
bool vis[MAXN], busy[MAXN];
int dist[MAXN];
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	int nodes, edges, queries; cin >> nodes >> edges >> queries;
	int sz = sqrt(nodes);
	for (int i = 0; i < edges; i++){
		int a, b; cin >> a >> b;
		radj[b].push_back(a);
	}
	for (int i = 1; i <= nodes; i++){
		vector<int> visv;
		dist[i] = 0; vis[i] = 1; visv.push_back(i);
		for (int prv : radj[i])
			for (auto p : best[prv]){
				int d = p.first + 1, x = p.second;
				if (vis[x]){
					if (d > dist[x]) dist[x] = d;
				}
				else {
					dist[x] = d;
					vis[x] = 1;
					visv.push_back(x);
				}
			}
		for (int x : visv) {
			best[i].push_back({dist[x], x});
			vis[x] = 0;
		}
		sort(best[i].begin(), best[i].end(), greater<pair<int, int>>());
		while (best[i].size() > sz) best[i].pop_back();
	}
	for (int q = 0; q < queries; q++){
		int x, bnum; cin >> x >> bnum;
		vector<int> bv(bnum);
		for (int i = 0; i < bnum; i++) {
			cin >> bv[i];
			busy[bv[i]] = 1;
		}
		if (bnum < sz){
			int ans = -1;
			for (auto p : best[x])
				if (!busy[p.second]){
					ans = p.first;
					break;
				}
			cout << ans << '\n';
		}
		else{
			vector<int> memo(x + 1, -1);
			for (int i = 1; i <= x; i++){
				if (!busy[i]) memo[i] = 0;
				for (int prv : radj[i])
					if (memo[prv] != -1)
						memo[i] = max(memo[i], memo[prv] + 1);
			}
			cout << memo[x] << '\n';
		}
		for (int i = 0; i < bnum; i++) busy[bv[i]] = 0;
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...