제출 #1237620

#제출 시각아이디문제언어결과실행 시간메모리
1237620thuhienneBitaro’s Party (JOI18_bitaro)C++20
100 / 100
1659 ms422064 KiB
#include <bits/stdc++.h> using namespace std; #define FastIO ios_base::sync_with_stdio(0);cin.tie(nullptr); #define MULTEST int t;cin >> t;while (t--) solve(); #define rf(__abc__) freopen(__abc__".inp","r",stdin);freopen(__abc__".out","w",stdout); ///Code goes here const int can = 300; int distinct = 0; int n,m,q; vector <int> adj[100009],revadj[100009]; void input() { cin >> n >> m >> q; for (int i = 1;i <= m;i++) { int u,v;cin >> u >> v; adj[u].push_back(v); revadj[v].push_back(u); } } //dp vector <pair<int,int>> dp[100001]; int exist[100009]; vector <pair<int,int>> mergesort(vector <pair<int,int>>& left,vector <pair<int,int>>& right) { vector <pair<int,int>> ret; int lpt = 0,rpt = 0; while (lpt < left.size() && rpt < right.size()) { if (left[lpt].first > right[rpt].first) { ret.push_back(left[lpt++]); } else { ret.push_back(right[rpt++]); } } for (;lpt < left.size();lpt++) ret.push_back(left[lpt]); for (;rpt < right.size();rpt++) ret.push_back(right[rpt]); return ret; } void predp() { for (int i = 1;i <= n;i++) { dp[i].push_back({-1,i}); for (int j = 1;j < can;j++) dp[i].push_back({-1e9,n + 1}); } for (int ver = 1;ver <= n;ver++) { for (int i = 0;i < can;i++) dp[ver][i].first++; for (auto des : adj[ver]) { //ver -> des vector <pair<int,int>> intermediate = mergesort(dp[ver],dp[des]); distinct++; int chosen = 0; for (auto value : intermediate) if (exist[value.second] != distinct) { exist[value.second] = distinct; dp[des][chosen] = value; chosen++; if (chosen == can) break; } } } } //query processing bool visited[100009],busy[100009]; int dp2[100009]; int caldp(int node) { if (visited[node]) return dp2[node]; visited[node] = 1; dp2[node] = (busy[node] ? -1e9 : 0); for (auto x : revadj[node]) { dp2[node] = max(dp2[node],caldp(x) + 1); } return dp2[node]; } void solve() { int root,num;cin >> root >> num; vector <int> record(num + 1); for (int i = 1;i <= num;i++) { cin >> record[i]; busy[record[i]] = 1; } if (num >= can) { for (int i = 1;i <= n;i++) visited[i] = dp2[i] = 0; cout << max(caldp(root),-1) << '\n'; } else { for (int i = 0;i < can;i++) if (!busy[dp[root][i].second]) { cout << max(dp[root][i].first,-1) << '\n'; break; } } for (int i = 1;i <= num;i++) busy[record[i]] = 0; } int main() { //rf(""); FastIO //MULTEST //preprocessing input(); predp(); //answer queries while (q--) solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...