题面

显然是树上差分模板题啦,不知道树上差分的童鞋可以去百度一下,很简单。

然后顺带学了一下 tarjan 的 O(N+Q) 离线求LCA的算法 (准确的说难道不应该带个并查集的复杂度吗???)

算法过程具体可以看这里

这里说一下我的理解。

大概可以把所有点分成三类(对于每个dfs的状态):已经遍历到的并且不在dfs栈中的点,已经遍历到并且在dfs栈中的点,未被遍历到的点。

其中,第二种的所有点构成了当前的右链。

然后dfs的过程就是,每个节点的子树遍历完了之后,它自己也就变成了第一种点,我们把这颗子树并到这个节点爸爸上。注意,此时它的爸爸必然是第二种节点。

稍加推理我们就可以发现,任意时刻每个前两种节点所在的并查集的根必然是它最近的一个第二种节点的祖先(如果是第二种节点就是它自己)。

然后我们每次dfs刚刚进入一个节点x的时候,就先回答涉及它的LCA询问:

1.若另一个点y已经被dfs过了(也即是前两种节点),那么它们的LCA就是 get_root(y)。这并不难理解,因为x在右链上,所以y与x的LCA必然是右链上离y最近的点,也就是get_root(y)。

2.若另一个点y没有被dfs过,那么不用管,因为我们必然会在dfs到y的时候处理x。

这么做之后,每组LCA只会被找一次。

复杂度还是线性的,代码还贼好写w

#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define pb push_back
const int N=50005; inline int read(){
int x=0; char ch=getchar();
for(;!isdigit(ch);ch=getchar());
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
return x;
} vector<int> g[N],ask[N];
int n,m,f[N],a[N],p[N],ans; int gr(int x){ return p[x]==x?x:(p[x]=gr(p[x]));} void dfs(int x,int fa){
f[x]=fa;
for(int i:ask[x]) if(f[i]>=0) a[gr(i)]--,a[f[gr(i)]]--;
for(int i:g[x]) if(i!=fa) dfs(i,x),p[i]=x;
} void update(int x){
for(int i:g[x]) if(i!=f[x]) update(i),a[x]+=a[i];
ans=max(ans,a[x]);
} inline void solve(){
for(int U,V;m;m--)
U=read(),V=read(),a[U]++,a[V]++,ask[U].pb(V),ask[V].pb(U);
memset(f,-1,sizeof(f)),dfs(1,0),update(1);
} int main(){
n=read(),m=read();
for(int i=1;i<=n;i++) p[i]=i;
for(int i=1,U,V;i<n;i++) U=read(),V=read(),g[U].pb(V),g[V].pb(U);
solve(),printf("%d\n",ans);
return 0;
}

  

[USACO15DEC] 最大流Max Flow && Tarjan 线性 LCA 教学?的更多相关文章

  1. P3128 [USACO15DEC]最大流Max Flow(LCA+树上差分)

    P3128 [USACO15DEC]最大流Max Flow 题目描述 Farmer John has installed a new system of  pipes to transport mil ...

  2. 洛谷P3128 [USACO15DEC]最大流Max Flow

    P3128 [USACO15DEC]最大流Max Flow 题目描述 Farmer John has installed a new system of N-1N−1 pipes to transpo ...

  3. luoguP3128 [USACO15DEC]最大流Max Flow 题解(树上差分)

    链接一下题目:luoguP3128 [USACO15DEC]最大流Max Flow(树上差分板子题) 如果没有学过树上差分,抠这里(其实很简单的,真的):树上差分总结 学了树上差分,这道题就极其显然了 ...

  4. 洛谷P3128 [USACO15DEC]最大流Max Flow [树链剖分]

    题目描述 Farmer John has installed a new system of  pipes to transport milk between the  stalls in his b ...

  5. 洛谷P3128 [USACO15DEC]最大流Max Flow (树上差分)

    ###题目链接### 题目大意: 给你一棵树,k 次操作,每次操作中有 a  b 两点,这两点路上的所有点都被标记一次.问你 k 次操作之后,整棵树上的点中被标记的最大次数是多少. 分析: 1.由于数 ...

  6. 洛谷P3128 [USACO15DEC]最大流Max Flow [倍增LCA]

    题目描述 Farmer John has installed a new system of  pipes to transport milk between the  stalls in his b ...

  7. 题解 P3128 【[USACO15DEC]最大流Max Flow】

    此类型题目有两种比较常见的做法:树链剖分和树上差分. 本题有多组修改一组询问,因此树上差分会比树链剖分优秀很多. 这里两种方法都进行介绍. 树链剖分和树上差分的本质都是将一颗树转换为一个区间,然后进行 ...

  8. luogu P3128 [USACO15DEC]最大流Max Flow (树上差分)

    题目描述 Farmer John has installed a new system of N-1N−1 pipes to transport milk between the NN stalls ...

  9. 树上差分——点差分裸题 P3128 [USACO15DEC]最大流Max Flow

    讲解: https://rpdreamer.blog.luogu.org/ci-fen-and-shu-shang-ci-fen #include <bits/stdc++.h> #def ...

随机推荐

  1. Ubuntu截图工具Flameshot

    今天来介绍一款Ubuntu下的截图工具,名叫Flameshot. 安装 Flameshot的安装很简单. 命令行安装 sudo apt-get install flameshot 一条命令搞定! 软件 ...

  2. 通过getAdaptiveExtension生成的动态类

    通过getAdaptiveExtension生成的动态类 方便调式使用 请放在根目录下

  3. java 框架-分布式文件管理系统1FastDFS

    https://www.cnblogs.com/chiangchou/p/fastdfs.html

  4. springboot mvc自动配置(一)自动配置DispatcherServlet和DispatcherServletRegistry

    所有文章 https://www.cnblogs.com/lay2017/p/11775787.html 正文 springboot的自动配置基于SPI机制,实现自动配置的核心要点就是添加一个自动配置 ...

  5. springboot启动流程(五)创建ApplicationContext

    所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 正文 springboot在启动过程中将会根据当前应用的类型创建对应的ApplicationC ...

  6. Julia 学习

    Julia 1.1 中文文档 Julia 中的数据可视化 --初探 一个简单的Julia教程(一) juliapro下载链接

  7. springboot2.0(二)

    三. Web开发 3.1.静态资源访问 在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目 ...

  8. 关于jQuery的源码学习

    注:该思维学习自另一个博客:https://blog.csdn.net/software0017/article/details/80317348 以下为我自己总结的jQuery结构:

  9. 第三方应用如何在SAP Kyma上进行服务注册

    Jerry之前的公众号文章 什么?在SAP中国研究院里还需要会PHP开发?提到了一个SAP Kyma的应用场景: 旅行兼社交达人伊森,使用经过SAP Kyma扩展之后的WordPress这个网站来写博 ...

  10. ECharts雷达图详细配置说明

    雷达图表配置说明: // 指定图表的配置项和数据 var option = { backgroundColor: 'rgba(204,204,204,0.7 )', // 背景色,默认无背景 rgba ...