WA0分求条
查看原帖
WA0分求条
755270
jzc114514楼主2024/12/2 15:58
#include<bits/stdc++.h>
using namespace std;
int n,k,root,mx=-114514;
int fa[50001],son[50002];
int diff[50002],now[50001];
int tst[20][50001];
int dep[50001];
vector<int>vec[50001];
bitset<50001>b,bb;
void dfs1(int x,int dp){
	dep[x]=dp;
	for(int i:vec[x]){
		if(b[i]==0){
			b[i]=1;
			fa[i]=x;
			dfs1(i,dp+1);
		}
	}
}
void dfs2(int x){
//	cout<<x<<" ";
	now[x]=now[fa[x]]+diff[x];
	for(int i:vec[x]){
		if(bb[i]==0){
			bb[i]=1;
			dfs2(i);
		}
	}
}
int LCA(int x,int y){
	if(dep[x]<dep[y])swap(x,y);
	int k=dep[x]-dep[y];
	for(int i=17;i>=0;i--){//抬高x,to dep[x]==dep[y] 
		if(k>=(1<<i)){
			k-=(1<<i);
			x=tst[i][x];
		}
	}
	if(x==y)return x;
	for(int i=17;i>=0;i--){//looking for x and y's LCA
		if(tst[i][x]&&tst[i][y]&&tst[i][x]!=tst[i][y]){
			x=tst[i][x];
			y=tst[i][y];
		}
	}
	return fa[x];
}
int main(){
	ios::sync_with_stdio(0);cin.tie(0);
	cin>>n>>k;
	for(int i=1;i<=n-1;i++){
		int u,v;
		cin>>u>>v;
		vec[u].push_back(v);
		vec[v].push_back(u);
	}
	for(int i=1;i<=n;i++){
		if(vec[i].size()==1){
			root=i;
			b[root]=bb[root]=1;
			break;
		}
	}
	dfs1(root,1);
	for(int i=1;i<=n+1;i++)son[i]=50001;
	for(int i=1;i<=n;i++){
		son[fa[i]]=i;
	}
	//st on tree
	for(int i=1;i<=n;i++)tst[0][i]=fa[i];
	for(int i=1;i<=18;i++){
		for(int q=1;q<=n;q++){//q的前2^i代父亲 
			tst[i][q]=tst[i-1][tst[i-1][q]];
		}
	}
	for(int i=1;i<=k;i++){
		int si,ti;
		cin>>si>>ti;
		int L=LCA(si,ti);
		if(L==si){
			diff[si]++;
			diff[son[ti]]--;
		}
		else if(L==ti){
			diff[ti]++;
			diff[son[si]]--;
		}
		else {
			diff[L]++;
			diff[son[si]]--;
			diff[son[ti]]--;
		}
	}
	
	dfs2(root);
	for(int i=1;i<=n;i++){
		mx=max(mx,now[i]);
	}
	cout<<mx;
}

2024/12/2 15:58
加载中...