Submission #1204548

#TimeUsernameProblemLanguageResultExecution timeMemory
1204548PlayVoltzBitaro’s Party (JOI18_bitaro)C++20
100 / 100
1250 ms421016 KiB
#include <cstdio>
#include <stdio.h>
#include <stdbool.h>
#include <iostream>
#include <map>
#include <vector>
#include <climits>
#include <stack>
#include <string>
#include <queue>
#include <algorithm>
#include <set>
#include <unordered_set>
#include <unordered_map>
#include <cmath>
#include <cctype>
#include <bitset>
#include <iomanip>
#include <cstring>
#include <numeric>
#include <cassert>
using namespace std;

//#define int long long
#define pii pair<int, int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second

vector<bool> visited;
vector<int> done, dist;
vector<vector<int> > graph, freq;

int dfs(int node, int t){
	if (visited[node])return dist[node];
	dist[node]=0;
	if (done[node]==t)dist[node]=INT_MIN/2;
	visited[node]=1;
	for (auto num:graph[node])dist[node]=max(dist[node], dfs(num, t)+1);
	return dist[node];
}

int32_t main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n, m, q, a, b;
	cin>>n>>m>>q;
	visited.resize(n+1, 0);
	graph.resize(n+1);
	freq.resize(n+1);
	dist.resize(n+1);
	done.resize(n+1, 0);
	vector<vector<pii> > dp(n+1);
	while (m--){
		cin>>a>>b;
		graph[b].pb(a);
	}
	for (int i=1; i<=n; ++i){
		int mx=0;
		for (auto num:graph[i])for (auto c:dp[num]){
			mx=max(mx, c.se+1);
			freq[c.se+1].clear();
			if (visited[c.fi])dist[c.fi]=max(dist[c.fi], c.se+1);
			else visited[c.fi]=1, dist[c.fi]=c.se+1;
		}
		for (auto num:graph[i])for (auto c:dp[num])if (visited[c.fi])visited[c.fi]=0, freq[dist[c.fi]].pb(c.fi);
		freq[0].clear();
		freq[0].pb(i);
		for (int d=mx; d>=0&&dp[i].size()*dp[i].size()<n; --d)for (auto c:freq[d]){
			dp[i].pb(mp(c, d));
			if (dp[i].size()*dp[i].size()>=n)break;
		}
	}
	for (int t=1; t<=q; ++t){
		cin>>a>>b;
		vector<int> vect(b);
		for (int i=0; i<b; ++i)cin>>vect[i], done[vect[i]]=t;
		if (vect.size()>=dp[a].size()){
			visited.assign(n+1, 0);
			cout<<max(-1, dfs(a, t))<<"\n";
		}
		else for (auto c:dp[a])if (done[c.fi]!=t){
			cout<<c.se<<"\n";
			break;
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...