Submission #1313800

#TimeUsernameProblemLanguageResultExecution timeMemory
1313800timeflewBitaro’s Party (JOI18_bitaro)C++20
100 / 100
850 ms148376 KiB
//usaco orz #include<bits/stdc++.h> using namespace std; #define ll long long const int mxN=1e5, mxM=2e5, B=100; vector<int> adj[mxN], radj[mxN]; vector<pair<int, int>> dist[mxN]; int n, m, q; int main() { ios::sync_with_stdio(0); cin.tie(0); cin>>n>>m>>q; for(int i=0; i<m; i++) { int a, b; cin>>a>>b; --a, --b; adj[a].push_back(b); radj[b].push_back(a); } vector<int> dis(n, -1); for(int i=0; i<n; i++) { dist[i].push_back({0, i}); vector<int> rec; for(int j : radj[i]) { for(auto [d, v] : dist[j]) { if(dis[v]==-1) dis[v]=d+1, rec.push_back(v); else dis[v]=max(dis[v], d+1); } } for(int j : rec) dist[i].push_back({dis[j], j}); sort(dist[i].begin(), dist[i].end(), greater<pair<int, int>>()); while(dist[i].size()>B) dist[i].pop_back(); for(int j : rec) { dis[j]=-1; } } while(q--) { int st; cin>>st; --st; int c; cin>>c; set<int> s; for(int i=0; i<c; i++) { int x; cin>>x; --x; s.insert(x); } if(c<B) { int ans=-1; for(auto [dis, x] : dist[st]) { if(s.find(x)==s.end()) { ans=dis; break; } } cout<<ans<<"\n"; } else { vector<int> dis(n); for(int x : s) dis[x]=-1; for(int i=0; i<n; i++) { if(dis[i]==-1) continue; for(int j : adj[i]) dis[j]=max(dis[i]+1, dis[j]); } cout<<dis[st]<<"\n"; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...