秒切树上查分....(最近一次集训理解的东西)

但是,我敲了半小时才切掉这道题....

我一直迷在了“边差分”和“点差分”的区别上。

所以,先说一下此题,再说一下区别。

首先,想到差分很容易。

然后,按照戴大爷的说法,x++,y++,lca(x,y)-=2;

这是模板,统计的是每条边被经过几次。理解一下,向上前缀和时,lca向上的那条边,会被计算两次,我们既不希望它被记录,也不希望它被记录两次。

所以,要消除前面的影响,就要把它在lca“断掉”,所以只要消除这条边的影响就行了,实现就是-2;

但是,这题,要求的是点的经过数,所以,貌似不太一样了。

继续考虑,怎么消除影响而且不影响lca那个点。

首先,lca要被记录一次,但是边差分时,为了消除影响,我们减了2次。所以,可以想到,-1即可。

但是,上面的点怎么办呢?怎么消除影响呢?

很简单啊,只要把lca的father给删掉,就可以啦。

也就是fa【lca】-1;

于是,只要点差分就可以了。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
int n,m;
struct edge
{
int to,next;
}e[maxn];
int head[maxn],cnt;
inline void addedge(int from,int to)
{
e[++cnt].next=head[from];
e[cnt].to=to;
head[from]=cnt;
}
int dep[maxn];
int fa[maxn][];
int son[maxn];
void dfs(int u,int f)
{
dep[u]=dep[f]+;
fa[u][]=f;
son[f]=u;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(v==f)
continue;
dfs(v,u);
}
}
int lca(int a,int b)
{
if(dep[a]>dep[b])
swap(a,b);//a<b
for(int i=;i>=;i--)
{
if(dep[b]-(<<i)>=dep[a])
b=fa[b][i];
}
if(a==b)
return a;
for(int i=;i>=;i--)
{
if(fa[a][i]!=fa[b][i])
{
a=fa[a][i];
b=fa[b][i];
}
}
return fa[a][];
}
int dis[maxn],ans;
void dfs2(int u,int f)
{
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(v==f)
continue;
dfs2(v,u);
dis[u]+=dis[v];
}
}
int main()
{
//freopen("zdl.in","r",stdin);
//freopen("zdl.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
}
dfs(,);
for(int i=;i<=;i++)
{
for(int j=;j<=n;j++)
{
fa[j][i]=fa[fa[j][i-]][i-];
}
}
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
int t=lca(x,y);
dis[x]++;
dis[y]++;
dis[t]-=;
dis[fa[t][]]-=;
}
dfs2(,);
for(int i=;i<=n;i++)
{
ans=max(dis[i],ans);//printf("%d ",dis[i]);
}
printf("%d",ans);
return ;
}

(完)

最新文章

  1. 设置glassfish开启自动domain
  2. swift language
  3. ftp
  4. Number plate recognition with Tensorflow
  5. 014安装Linux系统到开发板
  6. $.getJSON()方法的 callback说明
  7. [ReactiveCocoa]最简单的RAC入门操作
  8. centos6 qt ENV
  9. hdu1025
  10. Selenium自动化测试-进阶2-框架篇
  11. 自定义一个全屏的AlertDialog。
  12. python语言学习---4
  13. 开源框架.netCore DncZeus学习(四)项目升级
  14. nginx 相关命令
  15. WebRTC 学习之 Intel&#174; Collaboration Suite for WebRTC 关键类整理
  16. SQL server约束
  17. 复刻smartbits的国产网络测试工具minismb-操作技巧
  18. Jenkins的安装及使用(二)
  19. Android 7.1.1 之实现 3D Touch
  20. 如何在CentOS或者RHEL上启用Nux Dextop仓库 安装shutter截图工具

热门文章

  1. 什么是回流(重排 reflow)?什么是重绘(repaint)?如何减少回流、重绘?
  2. Jmeter中逻辑控制器
  3. 用JavaScript制作banner轮播图
  4. Cocos2d-x 学习笔记(7) 内存管理 Sprite SpriteFrame Texture2D
  5. (20)ASP.NET Core EF创建模型(必需属性和可选属性、最大长度、并发标记、阴影属性)
  6. 关于vue使用的一些小经验
  7. django2-创建项目
  8. 百万年薪python之路 -- re模块
  9. Class constructor FileManager cannot be invoked without &#39;new&#39;
  10. 05 python学习笔记-常用内置函数(五)