제출 #1265247

#제출 시각아이디문제언어결과실행 시간메모리
1265247nguyenhuythachBitaro’s Party (JOI18_bitaro)C++20
0 / 100
3 ms5444 KiB
#include <bits/stdc++.h> using namespace std; using pii = pair<int,int>; const int nmax = 100000 + 69; const int block = 320; int n,m,q; vector<int> adj[nmax]; vector<pii> savev[nmax]; int cnt[nmax]; int vst[nmax]; void input(){ ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m >> q; for(int i=1;i<=m;i++){ int u,v; cin >> u >> v; adj[max(u,v)].push_back(min(u,v)); } } vector<pii> merge_vec(const vector<pii> &a, const vector<pii> &b){ vector<pii> c; c.reserve(min((int)a.size() + (int)b.size(), block+5)); int pta=0, ptb=0; while(pta < (int)a.size() && ptb < (int)b.size()){ if(a[pta] > b[ptb]){ if(!cnt[a[pta].second]) c.push_back(a[pta]); cnt[a[pta].second]++; pta++; } else { if(!cnt[b[ptb].second]) c.push_back(b[ptb]); cnt[b[ptb].second]++; ptb++; } } for(int i=pta;i<(int)a.size();++i){ if(!cnt[a[i].second]) c.push_back(a[i]); cnt[a[i].second]++; } for(int i=ptb;i<(int)b.size();++i){ if(!cnt[b[i].second]) c.push_back(b[i]); cnt[b[i].second]++; } for(auto &p: c) cnt[p.second] = 0; if((int)c.size() > block) c.resize(block); return c; } void pre_dfs(int u,int p){ vst[u]=1; for(int v: adj[u]){ if(v==p) continue; if(!vst[v]) pre_dfs(v,u); for(auto &pr : savev[v]) pr.first++; savev[u] = merge_vec(savev[u], savev[v]); for(auto &pr : savev[v]) pr.first--; } } void build(){ for(int i=1;i<=n;i++) savev[i].clear(), savev[i].push_back({0,i}); for(int i=1;i<=n;i++) vst[i]=0; for(int i=n;i>=1;i--) if(!vst[i]) pre_dfs(i,0); } int busy_ver[nmax]; int visit_ver[nmax]; int curVer = 1; int dp_val[nmax]; void solve(){ build(); while(q--){ curVer++; int t,y; cin >> t >> y; for(int i=0;i<y;i++){ int x; cin >> x; busy_ver[x] = curVer; } if(y <= block){ bool ok = false; for(auto &pr : savev[t]){ int node = pr.second; if(busy_ver[node] != curVer){ cout << pr.first << '\n'; ok = true; break; } } if(!ok) cout << -1 << '\n'; continue; } // heavy query: iterative post-order DFS from t stack<tuple<int,int,int>> st; st.emplace(t, 0, 0); while(!st.empty()){ auto [u, p, state] = st.top(); st.pop(); if(state == 0){ if(visit_ver[u] == curVer) continue; visit_ver[u] = curVer; st.emplace(u, p, 1); for(int v: adj[u]) if(v != p) st.emplace(v, u, 0); } else { if(busy_ver[u] == curVer){ dp_val[u] = -1; } else { int best = 0; for(int v: adj[u]) if(v != p){ int child = dp_val[v]; if(child == -1) continue; if(child + 1 > best) best = child + 1; } dp_val[u] = best; } } } int out = dp_val[t]; if(busy_ver[t] == curVer) cout << -1 << '\n'; else cout << out << '\n'; } } int main(){ input(); solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...