A11 树上差分
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 P2680 [NOIP2015 提高组] 运输计划
Luogu P1600 [NOIP2016 提高组] 天天爱跑步
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!