#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int maxn = 1e5 + 100;
const int NEG = -1000000000;
int k;
vector<int> add[maxn];
vector<int> rem[maxn];
vector<pii> st[maxn];
int dp[maxn];
void build_all(int n){
for(int x=1;x<=n;x++){
unordered_map<int,int> mp;
mp.reserve(rem[x].size() * (size_t)(k + 1) + 4);
for(int p : rem[x]){
for(auto pr : st[p]){
int val = pr.first + 1;
int node = pr.second;
auto it = mp.find(node);
if(it == mp.end() || it->second < val)
mp[node] = val;
}
auto it2 = mp.find(p);
if(it2 == mp.end() || it2->second < 1)
mp[p] = 1;
}
auto it3 = mp.find(x);
if(it3 == mp.end() || it3->second < 0)
mp[x] = 0;
vector<pii> tmp;
tmp.reserve(mp.size());
for(auto &kv : mp)
tmp.push_back({kv.second, kv.first});
if((int)tmp.size() > k){
nth_element(tmp.begin(), tmp.begin() + k, tmp.end(),
[](const pii &a, const pii &b){
return a.first > b.first;
});
tmp.resize(k);
}
sort(tmp.begin(), tmp.end(),
[](const pii &a, const pii &b){
if(a.first != b.first) return a.first > b.first;
return a.second < b.second;
});
st[x].swap(tmp);
}
}
void ddfs(int x){
for(auto v : add[x]){
if(dp[v] == NEG) continue;
dp[x] = max(dp[x], dp[v] + 1);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,m,q;
if(!(cin>>n>>m>>q)) return 0;
k = sqrt(n) + 1;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
add[u].push_back(v);
rem[v].push_back(u);
}
build_all(n);
while(q--){
int u;
cin>>u;
int tt;
cin>>tt;
set<int> no;
for(int i=0;i<tt;i++){
int v;
cin>>v;
no.insert(v);
}
if((int)no.size() < k){
int ans = NEG;
for(auto p : st[u]){
if(!no.count(p.second))
ans = max(ans, p.first);
}
if(ans == NEG) cout << -1 << '\n';
else cout << ans << '\n';
} else {
for(int i=1;i<=n;i++) dp[i] = NEG;
dp[u] = 0;
for(int i=u;i>=1;i--) ddfs(i);
int ans = NEG;
for(int i=1;i<=u;i++){
if(!no.count(i))
ans = max(ans, dp[i]);
}
if(ans == NEG) cout << -1 << '\n';
else cout << ans << '\n';
}
}
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |