Submission #1314610

#TimeUsernameProblemLanguageResultExecution timeMemory
1314610m.h.nBitaro’s Party (JOI18_bitaro)C++20
7 / 100
2116 ms540604 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int,int> pii; int k; vector<vector<int>> addn; vector<vector<int>> remn; vector< set<pii> > st; vector< set<pii> > stt; vector<int> dp; void dfs(int x){ for(auto u : remn[x]){ for(auto p : st[u]){ pii tmp = p; auto ss = stt[x].lower_bound({tmp.second,-1}); if(ss != stt[x].end() && ss->first == tmp.second){ pii dd = *ss; if(dd.second < tmp.first+1){ auto it = st[x].find({dd.second,dd.first}); if(it != st[x].end()) st[x].erase(it); stt[x].erase(ss); st[x].insert({tmp.first+1,tmp.second}); stt[x].insert({tmp.second,tmp.first+1}); } } else { st[x].insert({tmp.first+1,tmp.second}); stt[x].insert({tmp.second,tmp.first+1}); } } st[x].insert({1,u}); stt[x].insert({u,1}); while((int)st[x].size() > k){ pii tmp = *st[x].begin(); st[x].erase(st[x].find(tmp)); auto it2 = stt[x].find({tmp.second,tmp.first}); if(it2 != stt[x].end()) stt[x].erase(it2); } } st[x].insert({0,x}); stt[x].insert({x,0}); while((int)st[x].size() > k){ auto it = st[x].begin(); pii ss = *it; st[x].erase(it); auto it2 = stt[x].find({ss.second,ss.first}); if(it2 != stt[x].end()) stt[x].erase(it2); } } void ddfs(int x){ for(auto v : addn[x]){ if(dp[v] == -1000000000) continue; if(dp[x] < dp[v] + 1) 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 = (int)sqrt(n) + 1; addn.assign(n+1, vector<int>()); remn.assign(n+1, vector<int>()); st.assign(n+1, set<pii>()); stt.assign(n+1, set<pii>()); dp.assign(n+1, 0); for(int i=0;i<m;i++){ int u,v; cin >> u >> v; addn[u].push_back(v); remn[v].push_back(u); } for(int i=1;i<=n;i++) dfs(i); while(q--){ int T; cin >> T; int Y; cin >> Y; set<int> busy; for(int i=0;i<Y;i++){ int c; cin >> c; busy.insert(c); } if((int)busy.size() < k){ int ans = -1000000000; for(auto p : st[T]){ if(busy.find(p.second) == busy.end()) ans = max(ans, p.first); } if(ans == -1000000000) cout << -1 << '\n'; else cout << ans << '\n'; } else { for(int i=1;i<=n;i++) dp[i] = -1000000000; dp[T] = 0; for(int i=T;i>0;i--) ddfs(i); int ans = -1000000000; for(int i=1;i<=T;i++){ if(!busy.count(i)) ans = max(ans, dp[i]); } if(ans == -1000000000) cout << -1 << '\n'; else cout << ans << '\n'; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...