제출 #1308724

#제출 시각아이디문제언어결과실행 시간메모리
1308724mohammadhadinajafiBitaro’s Party (JOI18_bitaro)C++20
7 / 100
2094 ms4996 KiB
#include <bits/stdc++.h> using namespace std; using pii = pair<int,int>; const int MAXN = 100000 + 5; const int LIMIT = 320; int n,m,q; vector<int> adj[MAXN], revv[MAXN]; vector<pii> dis[MAXN]; bool ban[MAXN]; int f[MAXN]; void MergeVec(vector<pii>& A, const vector<pii>& B){ vector<pii> Binc; Binc.reserve(B.size()); for(auto &p: B) Binc.emplace_back(p.first + 1, p.second); vector<pii> tmp; tmp.reserve(LIMIT+5); unordered_set<int> used; int ia = 0, ib = 0; while((ia < (int)A.size() || ib < (int)Binc.size()) && (int)tmp.size() < LIMIT){ pii va = {INT_MIN, -1}, vb = {INT_MIN, -1}; if(ia < (int)A.size()) va = A[ia]; if(ib < (int)Binc.size()) vb = Binc[ib]; if(va.first >= vb.first){ if(!used.count(va.second)){ used.insert(va.second); tmp.push_back(va); } ia++; } else { if(!used.count(vb.second)){ used.insert(vb.second); tmp.push_back(vb); } ib++; } } A.swap(tmp); } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); if(!(cin >> n >> m >> q)) return 0; for(int i=0;i<m;i++){ int u,v; cin >> u >> v; adj[u].push_back(v); revv[v].push_back(u); } for(int x = 1; x <= n; ++x){ dis[x].push_back({0, x}); for(int u : revv[x]){ MergeVec(dis[x], dis[u]); } } for(int qi = 0; qi < q; ++qi){ int T, Y; cin >> T >> Y; vector<int> busy(Y); for(int i=0;i<Y;i++){ cin >> busy[i]; ban[busy[i]] = true; } int ans = -1; if(Y < LIMIT){ for(auto &p : dis[T]){ if(!ban[p.second]){ ans = p.first; break; } } } else { const int NEG = -1000000000; for(int i=1;i<=T;i++) f[i] = NEG; f[T] = 0; if(!ban[T]) ans = 0; for(int i=T-1;i>=1;i--){ for(int v: adj[i]) if(v <= T) f[i] = max(f[i], f[v] + 1); if(!ban[i]) ans = max(ans, f[i]); } if(ans < -100000000) ans = -1; } for(int b: busy) ban[b] = false; cout << ans << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...