题意:给一颗无根树,每次操作把 u,v 路径上所有点的权 +1。问最大点权.只过了第一个点求调qwq
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
const int N=5e5+5;
vector<int> Q[N];
vector<int> G[N];
int lca,n,m,vis[N],p[N],C,siz[N],sc=0x7fffffff,mx1,fa[N];
void getcentre(int,int);
void add(int,int);
void addQuery(int,int);
int find(int);
void dfs(int u){
fa[u]=u,vis[u]=1;
for(int v:G[u])
if(!vis[v]) dfs(v),fa[v]=u;
for(int v:Q[u])
if(vis[v]) lca=find(v),++p[u],++p[v],--p[lca],--p[fa[lca]];
}
int dfs1(int u,int fa){
//printf("dfs1:%d %d\n",u,fa);
for(int v:G[u])
if(v!=fa) p[u]+=dfs1(v,u);
mx1=max(mx1,p[u]);
return p[u];
}
main(){
//cin.tie(0)->sync_with_stdio(0);
cin>>n>>m;
for(int i=1,x,y;i<n;++i)
cin>>x>>y,add(x,y);
getcentre(1,0);
//for(int i=1;i<=n;++i) cout<<siz[i]<<" \n"[i==n];
for(int x,y;m--;)
cin>>x>>y,addQuery(x,y);
dfs(C),memset(vis,0,sizeof vis),dfs1(C,0);
//for(int i=1;i<=n;++i) cout<<p[i]<<" \n"[i==n];
cout<<mx1;
}
void getcentre(int u,int fa){
siz[u]=1;
int mx=0;
for(auto v:G[u]){
if(v==fa) continue;
getcentre(v,u),siz[u]+=siz[v];
mx=max(siz[v],mx);
}
mx=max(n-siz[u],mx);
if(mx<sc||(mx==sc&&u<C))C=u,sc=mx;
}
void addQuery(int u,int v){
Q[u].pb(v),Q[v].pb(u);
}
void add(int u,int v){
G[u].pb(v),G[v].pb(u);
}
int find(int x){
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}