——————————————————————————————————————————————————————————
树上差分模板题,综合了差分的思想与LCA的应用
分为点差分与边差分
——————————————————————————————————————————————
#include<bits/stdc++.h> using namespace std; struct node{int nxt,to;}eg[50100*2]; int n,dep[50100],fa[50100][22],ne,ans=-100000,m,a,b,head[50100],cf[50100]; void adde(int f,int v){eg[++ne].to=v;eg[ne].nxt=head[f];head[f]=ne;} void dfs(int u,int f) { for(int i=head[u];i;i=eg[i].nxt) { if(eg[i].to==f)continue; int v=eg[i].to; fa[v][0]=u; dep[v]=dep[u]+1; dfs(v,u); } } int lca(int x,int y) { if(dep[x]<dep[y])swap(x,y); for(int j=20;j>=0;j--) if(dep[fa[x][j]]>=dep[y])x=fa[x][j]; if(x==y)return x; for(int j=20;j>=0;j--) if(fa[x][j]!=fa[y][j]) x=fa[x][j],y=fa[y][j]; return fa[x][0]; } void dfs2(int u) { for(int i=head[u];i;i=eg[i].nxt) { int v=eg[i].to; if(v==fa[u][0])continue; dfs2(v); cf[u]+=cf[v]; } ans=max(cf[u],ans); } int main() { cin>>n>>m; for(int i=1;i<n;i++) {cin>>a>>b;adde(a,b);adde(b,a);} dep[1]=1;dfs(1,0);fa[1][0]=0; for(int i=1;i<=20;i++) for(int j=1;j<=n;j++)fa[j][i]=fa[fa[j][i-1]][i-1]; while(m--) { cin>>a>>b; ++cf[a]; ++cf[b]; --cf[lca(a,b)]; --cf[fa[lca(a,b)][0]]; } dfs2(1); cout<<ans; }