树上差分+倍增lca 只有20分 求调!

P3128 [USACO15DEC] Max Flow P

``` #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int n,first[100010],m,tot1,lg[100010],deep[100010],fa[100010][21],d[100010]; int maxn; struct edge { int ed,nxt;}e[100010]; int fadd(int x,int y) { e[++tot1].ed=y;e[tot1].nxt=first[x];first[x]=tot1; return 0; } int dfs(int x,int bef) { deep[x]=deep[bef]+1; fa[x][0]=bef; int i; for(i=1;(1<<i)<=deep[x];i++) fa[x][i]=fa[fa[x][i-1]][i-1]; for(i=first[x];i!=-1;i=e[i].nxt) { int y=e[i].ed; if(y==bef) continue; dfs(y,x); } return 0; } int lca(int x,int y) { if(deep[x]<deep[y]) swap(x,y); /*for(int i=lg[deep[x]-deep[y]]-1;i=0;i--) { if(fa[x][i]<deep[y]) continue; else x=fa[x][i];}*/ while(deep[x]>deep[y]) x=fa[x][lg[deep[x]-deep[y]]-1]; if(x==y) return y; for(int i=lg[deep[x]]-1;i=0;i--) { if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i]; } return fa[x][0]; } int dfs1(int x,int bef) { int i,now=d[x]; for(i=first[x];i!=-1;i=e[i].nxt) { int y=e[i].ed; if(y==bef) continue; now+=dfs1(y,x); } maxn=max(maxn,now); return now; } int main() { freopen("A.in","r",stdin); freopen("A.out","w",stdout); int i,x,y,j; memset(first,-1,sizeof(first)); scanf("%d%d",&n,&m); for(i=1;i<=n-1;i++) { scanf("%d%d",&x,&y); fadd(x,y);fadd(y,x); } for(i=1;i<=n;i++) { lg[i]=lg[i-1]; if(i==(1<<lg[i-1])) lg[i]++; } dfs(1,0); for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); d[x]++;d[y]++;d[lca(x,y)]--;d[fa[lca(x,y)][0]]--;} x=dfs1(1,0); printf("%d",maxn); return 0; } ```
by Barcelona_Messi @ 2019-11-10 22:35:40


for循环的边界是不是应该改成 "==" 啊, "=" 不是赋值吗...
by 蘸醋的三文鱼 @ 2019-11-10 23:06:22


lca函数最后一个循环里面
by Azazеl @ 2019-11-11 22:22:40


|