Submission #786110

#TimeUsernameProblemLanguageResultExecution timeMemory
786110vjudge1Tax Evasion (LMIO19_mokesciai)C++17
100 / 100
164 ms50088 KiB
#include<bits/stdc++.h>
using namespace std;
int n, m, cnt, x;
int par[18][200005], dep[200005], lft[200005], rgt[200005];
bool b[200005];
vector<int> adjl[200005], que[200005], order;
 
void tour(int x){
	order.push_back(x);
	lft[x]=cnt++;
	for(int i:adjl[x]){
		tour(i);
	}
	rgt[x]=cnt;
}
 
int anc(int x, int dp){
	for(int i=17; i>=0; i--){
		if(dp&(1<<i)) x=par[i][x];
	}
	return x;
}
 
int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
 
	cin >> n >> m;
	for(int i=2; i<=n; i++){
		cin >> x;
		par[0][i]=x;
		dep[i]=dep[x]+1;
		adjl[x].push_back(i);
	}
	for(int i=1; i<18; i++){
		for(int j=1; j<=n; j++){
			par[i][j]=par[i-1][par[i-1][j]];
		}
	}
	for(int i=0; i<m; i++){
		cin >> x;
		b[x]=1;
	}
	tour(1);
	for(int i=1; i<=n; i++){
		if(b[i]){
			int up=anc(i, (dep[i]-1)/2);
			que[lft[up]].push_back(rgt[up]);
		}
	}
 
	int res=0, mid, l=0, r=n;
	while(l<=r){
		mid=(l+r)/2;
		priority_queue<int, vector<int>, greater<int>> pq;
		bool can=1;
		for(int i=0; i<n && can; i++){
			for(int j:que[i]) pq.push(j);
			if(dep[order[i]]>=mid && !pq.empty()){
				int x=pq.top();
				pq.pop();
				if(x<=i) can=0;
			}
		}
		if(!pq.empty()) can=0;
		if(can){
			res=mid;
			l=mid+1;
		}else{
			r=mid-1;
		}
	}
	cout << res+1 << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...