제출 #236140

#제출 시각아이디문제언어결과실행 시간메모리
236140oolimryBitaro’s Party (JOI18_bitaro)C++14
100 / 100
1852 ms218904 KiB
#include <bits/stdc++.h>
#define node second
#define dist first
#define all(x) x.begin(), x.end()
using namespace std;
typedef pair<int,int> ii;

const int B = 150;

vector<ii> best[100005];
vector<int> adj[100005];
bool ban[100005];
int memo[100005];
int vis[100005];
int inTemp[100005];

void dfs(int u){
	best[u].push_back(ii(0,u));
	
	for(int v : adj[u]){
		if(best[v].empty()) dfs(v);
		for(ii x : best[v]){
			int pos = inTemp[x.node];
			if(pos == 0){
				inTemp[x.node] = (int) best[u].size();
				best[u].push_back(ii(x.dist+1,x.node));
			}
			else{
				best[u][pos].dist = max(best[u][pos].dist,x.dist+1);
			}
		}
	}
	
	for(ii x : best[u]) inTemp[x.node] = 0;
	
	nth_element(best[u].begin(), best[u].begin() + B, best[u].end(), [&](ii a, ii b){ return a.dist > b.dist; });
	while(best[u].size() > B) best[u].pop_back();
	vis[u] = true;
}

int dfs2(int u){
	if(memo[u] != -1) return memo[u];
	
	int ans = 0;
	if(ban[u]) ans = -10234567;
	
	for(int v : adj[u]){
		ans = max(ans, dfs2(v)+1);
	}
	
	memo[u] = ans;
	
	return memo[u];
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(0);
	
	int n, m, Q; cin >> n >> m >> Q;
	fill(inTemp, inTemp+n+1, -1);
	
	while(m--){
		int u, v; cin >> u >> v;
		adj[v].push_back(u);
	}
	
	for(int i = 1;i <= n;i++){
		if(!vis[i]) dfs(i);
	}
		
	while(Q--){
		
		int t; cin >> t;
		int S; cin >> S;
		
		vector<int> cannot;
		
		for(int i = 0;i < S;i++){
			int x; cin >> x;
			cannot.push_back(x);
		}
		for(int x : cannot) ban[x] = true;
		
		if(S >= B){
			fill(memo, memo+n+1, -1);
			cout << max(-1, dfs2(t)) << "\n";
		}
		else{
			int ans = -1;
			for(ii x : best[t]){
				if(!ban[x.node]){
					ans = max(ans,x.dist);
				}
			}
			cout << ans << "\n";
		}	
		
		for(int x : cannot) ban[x] = false;
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...