제출 #1288661

#제출 시각아이디문제언어결과실행 시간메모리
1288661c4lBitaro’s Party (JOI18_bitaro)C++20
100 / 100
1175 ms423368 KiB
#include <bits/stdc++.h>
#define f first
#define s second
using namespace std;
vector<int> a[100001], b[100001];
vector<pair<int, int>> luu[100001];
int mx[100001];
int s = 320;
int dp[100001];
vector<bool> tag(100001, false), vst(100001, false);
vector<int> topo;
void dfs(int u){
	vst[u] = true;
	for (int v:b[u]){
		if(!vst[v])dfs(v);
	}
	topo.push_back(u);
}
int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int n, m, q;
	cin >> n >> m >> q;
	for (int i = 1;i<=m;++i){
		int u, v;
		cin >> u >> v;
		a[u].push_back(v);
		b[v].push_back(u);
	}
	for (int u = 1;u<=n;++u){
		luu[u].push_back({0, u});
		for (int v:b[u]){
			for (auto i:luu[v]){
				if(mx[i.s]==0){
					luu[u].push_back(i);
					mx[i.s] = i.f+1;
				}else mx[i.s] = max(mx[i.s], i.f+1);
			}
		}
		sort(luu[u].begin(), luu[u].end(), [](pair<int, int> p, pair<int, int> q){
			return mx[p.s] > mx[q.s];
		});
		while(luu[u].size() > s){
			auto [d, v] = luu[u].back();
			mx[v] = 0;
			luu[u].pop_back();
		}
		for (auto &i:luu[u]){
			i.f = mx[i.s];
			mx[i.s] = 0;
		}
	}
	while(q--){
		int t, y;
		cin >> t >> y;
		vector<int> tmp;
		for (int i = 1;i<=y;++i){
			int tt;
			cin >> tt;
			tag[tt] = true;
			tmp.push_back(tt);
		}
		if(y<s){
			int res = -1;
			for (auto i:luu[t]){
				if(!tag[i.s]){
					res= i.f;
					break;
				}
			}
			for (int i:tmp){
				tag[i] = false;
			}
			cout << res << '\n';
		}else{
			int res = -1;
			for (int i =1;i<=n;++i){
				dp[i] = -1;
				vst[i] = false;
			}
			topo.clear();
			dfs(t);
			reverse(topo.begin(), topo.end());
			dp[t] = 0;
			for (int u:topo){
				for (int v:b[u]){
					dp[v] = max(dp[v], dp[u]+1);
				}
			}
			for (int i = 1;i<=n;++i){
				if(!tag[i])res = max(res, dp[i]);
			}
			for (int i:tmp){
				tag[i] = false;
			}
			cout << res << '\n';
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...