제출 #1314074

#제출 시각아이디문제언어결과실행 시간메모리
1314074m.h.nBitaro’s Party (JOI18_bitaro)C++20
7 / 100
2115 ms534980 KiB
#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]; set<pii> st[maxn]; set<pii> stt[maxn]; int dp[maxn]; void dfs(int x){ for(auto u : rem[x]){ for(auto p : st[u]){ pii tmp = p; auto ss = stt[x].lower_bound({tmp.second, INT_MIN}); 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}); } } auto ss = stt[x].lower_bound({u, INT_MIN}); if(ss != stt[x].end() && ss->first == u){ if(ss->second < 1){ st[x].erase({ss->second, u}); stt[x].erase(ss); st[x].insert({1, u}); stt[x].insert({u, 1}); } } else { st[x].insert({1, u}); stt[x].insert({u, 1}); } } 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 : 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; cin >> n >> m >> q; 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); } for(int i=1;i<=n;i++) dfs(i); 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.find(p.second) == no.end()) 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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...