Submission #1301942

#TimeUsernameProblemLanguageResultExecution timeMemory
1301942duyanhchupapiBitaro’s Party (JOI18_bitaro)C++20
7 / 100
2093 ms7080 KiB
#include <bits/stdc++.h>
using namespace std; 
using ll = long long; 
const int N = 1e5 + 5, inf = 2e9;
int n, m, q;
vector <int> g[N], adj[N];
vector <pair<int, int>> luu[N];
int dp[N], c[N];
bool busy[N], seen[N];

int main() { 
	ios_base::sync_with_stdio(0); cin.tie(0);
	// freopen(".INP", "r", stdin);
	// freopen(".OUT", "w", stdout);
		
	cin >> n >> m >> q;
	while (m--) {
		int u, v;
		cin >> u >> v;
		g[u].push_back(v);
		adj[v].push_back(u);
	}	
	
	int sq = 300;
	for (int u=1;u<=n;++u) {
		vector <pair<int, int>> tmp;
		for (int v : adj[u]) {
			for (pair <int, int> P : luu[v]) tmp.push_back(P);
			tmp.emplace_back(0, v);
		}
		
		sort(tmp.begin(), tmp.end(), greater<>());
		for (pair <int, int> P : tmp) {
			if (!seen[P.second]) {
				luu[u].emplace_back(P.first + 1, P.second);
				seen[P.second] = 1;
				if (luu[u].size() == sq) break;
			}
		}
		
		for (pair <int, int> P : luu[u]) seen[P.second] = 0;
	}
	
	while (q--) {
		int t, y, ans = -1;
		cin >> t >> y;
		for (int i=1;i<=y;++i) cin >> c[i], busy[c[i]] = 1;
		if (!busy[t]) ans = 0;
		
		if (y >= sq) {
			fill(dp, dp+n+1, -inf);
			dp[t] = 0;
			for (int u=t;u>=1;--u) {
				for (int v : adj[u]) dp[v] = max(dp[u] + 1, dp[v]);
			}
			
			for (int i=1;i<=t;++i) if (!busy[i]) ans = max(ans, dp[i]);
		}
		else {
			for (pair <int, int> P : luu[t]) 
				if (!busy[P.second]) ans = max(ans, P.first);
		}
		
		for (int i=1;i<=y;++i) busy[c[i]] = 0;
		cout << ans << '\n';	
	}

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...