제출 #1314091

#제출 시각아이디문제언어결과실행 시간메모리
1314091m.h.nBitaro’s Party (JOI18_bitaro)C++20
7 / 100
2087 ms192340 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]; 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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...