제출 #1347662

#제출 시각아이디문제언어결과실행 시간메모리
1347662jumpBitaro’s Party (JOI18_bitaro)C++20
7 / 100
469 ms589824 KiB
#include <bits/stdc++.h>
#define int long long
int RANGE=300;
int n,m,q;
int height[100010];
std::vector<std::pair<int,int>> dpV[100010];
std::vector<std::pair<int,int>> dpVn[100010];
int dp[100010];
int tempDp[100010];
std::vector<int> adj[100010];
std::vector<int> rev[100010];
std::vector<int> order;
bool visit[100010];
void dfs(int curr){
	if(visit[curr])return;
	visit[curr]=true;
	for(auto to:adj[curr]){
		dfs(to);
	}
	order.push_back(curr);
	return;
}
signed main(){
	std::cin >> n >> m >> q;
	RANGE=300;
	for(int i=0;i<m;i++){
		int s,e;
		std::cin >> s >> e;
		adj[s].push_back(e);
		rev[e].push_back(s);
	}
	for(int i=1;i<=n;i++){
		dfs(i);
	}
	std::reverse(order.begin(),order.end());
	for(int i=1;i<=n;i++){
		while(dpV[i].size()<RANGE){
			int best=-1,idx=-1;
			for(int k=0;k<rev[i].size();k++){
				if(dpVn[rev[i][k]].empty())continue;
				if(dpVn[rev[i][k]].back().first>best){
					idx=k;
					best=dpVn[rev[i][k]].back().first;
				}
			}
			if(best==-1)break;
			dpV[i].push_back({dpVn[rev[i][idx]].back().first+1,dpVn[rev[i][idx]].back().second});
			dpVn[rev[i][idx]].pop_back();
		}
		if(dpV[i].size()<RANGE)dpV[i].push_back({0,i});
		std::reverse(dpV[i].begin(),dpV[i].end());
		dpVn[i]=dpV[i];
		for(auto from:rev[i]){
			dpVn[from]=dpV[from];
		}
	}
	for(int i=1;i<=n;i++){
		std::reverse(dpV[i].begin(),dpV[i].end());
		// for(auto [num,from]:dpV[i]){
		// 	std::cout << num << ' ' << from << '|';
		// }
		// std::cout << '\n';
	}
	while(q--){
		int t,y;
		std::vector<int> absent;
		std::cin >> t >> y;
		for(int i=0;i<y;i++){
			int yin;
			std::cin >> yin;
			absent.push_back(yin);
		}
		int ans=-1;
		for(auto [num,from]:dpV[t]){
			auto itr = std::lower_bound(absent.begin(),absent.end(),from);
			if(itr==absent.end()||*itr!=from){
				ans = num;
				break;
			}
		}
		if(ans!=-1){
			std::cout << ans << '\n';
			continue;
		}
		for(int i=1;i<=n;i++){
			auto itr = std::lower_bound(absent.begin(),absent.end(),i);
			if(itr==absent.end()||*itr!=i)
			tempDp[i]=0;
			else
			tempDp[i]=-1e9;
		}
		for(auto curr:order){	
			for(auto to:adj[curr]){
				tempDp[to]=std::max(tempDp[to],tempDp[curr]+1);
			}
		}
		tempDp[t]=std::max((int)(-1),tempDp[t]);
		std::cout << tempDp[t] << '\n';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...