# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1204547 | PlayVoltz | Bitaro’s Party (JOI18_bitaro) | C++20 | 0 ms | 0 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(-1ll, dfs(a, t))<<"\n";
}
else for (auto c:dp[a])if (done[c.fi]!=t){
cout<<c.se<<"\n";
break;
}
}
}