l c a
0景区导游 - 蓝桥云课
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+100;
int deep[N],dp[N][30],dist[N],p[N];
vector<int>e[N],w[N];
void dfs(int u,int father)
{
deep[u]=deep[father]+1;
dp[u][0]=father;
for(int i=1;i<=20;i++)
dp[u][i]=dp[dp[u][i-1]][i-1];
for(int i=0;i<e[u].size();i++)
{
int v=e[u][i],ww=w[u][i];
if(v==father)
continue;
dist[v]=dist[u]+ww;
dfs(v,u);
}
}
int lca(int x,int y)
{
if(deep[x]<deep[y])
swap(x,y);
for(int i=20;i>=0;i--)
{
if(deep[dp[x][i]]>=deep[y])
{
x=dp[x][i];
}
}
if(x==y)
return x;
for(int i=20;i>=0;i--)
{
if(dp[x][i]!=dp[y][i])
{
x=dp[x][i];
y=dp[y][i];
}
}
return dp[x][0];
}
int getdist(int x,int y)
{
if(x==0||y==0)
return 0;
return dist[x]+dist[y]-2*dist[lca(x,y)];
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n,k;
cin>>n>>k;
for(int i=1;i<n;i++)
{
int u,v,ww;
cin>>u>>v>>ww;
e[u].push_back(v);
e[v].push_back(u);
w[u].push_back(ww);
w[v].push_back(ww);
}
dfs(1,0);
int sum=0;
for(int i=1;i<=k;i++)
{
cin>>p[i];
sum+=getdist(p[i],p[i-1]);
}
for(int i=1;i<=k;i++)
{
int dist1=getdist(p[i],p[i-1]);
int dist2=getdist(p[i],p[i+1]);
int dist3=getdist(p[i-1],p[i+1]);
cout<<sum-dist1-dist2+dist3<<' ';
}
return 0;
}
0砍树 - 蓝桥云课
#include <bits/stdc++.h>
#define int long long
#define pii pair<int,int>
using namespace std;
const int N=1e5+100;
int deep[N],dp[N][30];
vector<int>e[N];
map<pii,int>id;
int f[N],fa[N];
void dfs(int u,int father)
{
deep[u]=deep[father]+1;
dp[u][0]=father;
for(int i=1;i<=20;i++)
dp[u][i]=dp[dp[u][i-1]][i-1];
for(int i=0;i<e[u].size();i++)
{
int v=e[u][i];
if(v==father)
continue;
dfs(v,u);
}
}
int lca(int x,int y)
{
if(deep[x]<deep[y])
swap(x,y);
for(int i=20;i>=0;i--)
{
if(deep[dp[x][i]]>=deep[y])
{
x=dp[x][i];
}
}
if(x==y)
return x;
for(int i=20;i>=0;i--)
{
if(dp[x][i]!=dp[y][i])
{
x=dp[x][i];
y=dp[y][i];
}
}
return dp[x][0];
}
void sum(int u,int father)
{
fa[u]=father;
for(auto it:e[u])
{
if(it==father)
continue;
sum(it,u);
f[u]+=f[it];
}
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n,m;
cin>>n>>m;
for(int i=1;i<n;i++)
{
int u,v;
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
id[{u,v}]=i;
id[{v,u}]=i;
}
dfs(1,0);
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
f[a]++;
f[b]++;
f[lca(a,b)]-=2;
}
sum(1,0);
int ans=-1;
for(int i=1;i<=n;i++)
{
//cout<<f[i]<<'\n';
if(f[i]==m)
{
int k=id[{i,fa[i]}];
ans=max(ans,k);
}
}
cout<<ans;
return 0;
}