A11 树上差分

视频链接:A11 树上差分_哔哩哔哩_bilibili

D09 倍增算法 P3379【模板】最近公共祖先(LCA)_哔哩哔哩_bilibili

Luogu P3128 [USACO15DEC] Max Flow P

 

 

 

复制代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 50005, M=2*N;
int h[N], to[M], ne[M], tot;
int dep[N],fa[N][22];
int n,m,ans,power[N];

void add(int x,int y){ //加边
  to[++tot]=y,ne[tot]=h[x],h[x]=tot;
}
void dfs(int u,int f){ //倍增预处理
  dep[u]=dep[f]+1, fa[u][0]=f;
  for(int i=0; fa[u][i]; ++i) 
    fa[u][i+1]=fa[fa[u][i]][i];
  for(int i=h[u]; i; i=ne[i])
    if(to[i]!=f) dfs(to[i],u);
}
int lca(int u,int v){ //倍增求lca
  if(dep[u]>dep[v]) swap(u,v);
  for(int i=20; i>=0; --i) 
    if(dep[u]<=dep[v]-(1<<i)) v=fa[v][i];
  if(u==v) return u;
  for(int i=20; i>=0; --i) 
    if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
  return fa[u][0];
}
void dfs2(int u,int f){ //统计答案
  for(int i=h[u]; i; i=ne[i]){
    int v=to[i];
    if(v==f) continue;
    dfs2(v,u);
    power[u]+=power[v];
  }
  ans=max(ans,power[u]);
}
int main(){
  scanf("%d%d",&n,&m);
  for(int i=1,x,y;i<n;++i){
    scanf("%d%d",&x,&y);
    add(x,y); add(y,x);
  }
  dfs(1,0);
  for(int i=1,x,y; i<=m; ++i){
    scanf("%d%d",&x,&y);
    int l=lca(x,y);
    ++power[x];++power[y]; //树上差分
    --power[l];--power[fa[l][0]]; 
  }
  dfs2(1,0);
  printf("%d\n",ans);
}
复制代码

 

练习:

Luogu U143800 暗之连锁

Luogu P3258 [JLOI2014] 松鼠的新家

Luogu P2680 [NOIP2015 提高组] 运输计划

Luogu P1600 [NOIP2016 提高组] 天天爱跑步

Luogu P4556 [Vani有约会] 雨天的尾巴

 

posted @   董晓  阅读(785)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示