#\(\mathcal{\color{red}{Description}}\)

\(Link\)

\(FJ\)给他的牛棚的\(N(2≤N≤50,000)\)个隔间之间安装了\(N-1\)根管道,隔间编号从\(1\)到\(N\)。所有隔间都被管道连通了。

\(FJ\)有\(K(1≤K≤100,000)\)条运输牛奶的路线,第i条路线从隔间\(s_i\)运输到隔间\(t_i\)。一条运输路线会给它的两个端点处的隔间以及中间途径的所有隔间带来一个单位的运输压力,你需要计算压力最大的隔间的压力是多少。

#\(\color{red}{\mathcal{Solution}}\)

好的,今天学习了树上差分,感觉海星\(qwq\)。

树上差分

差分主要用来解决区间加减、单点查询一类问题,。那么所谓树上差分……顾名思义就是在树上搞差分,而在树上的操作就要丰富得多,可以支持链上修改、单点查询。很显然的是,树上差分遵循的原则应该是儿子加父亲减,从而达到逻辑关系一定的目的。而事实上一共有两种差分方式:

·边差分

边差分适用于更改边权对于普通的边差分而言,我们不妨把每条边的标记打在深度较大的点上因为并不可以打在深度小的点上,然后很显然的为了防止标记“蔓延”,所以我们要$$dif_u ++,dif_v++,dif_{LCA(u,v)} -= 2$$

·点差分

所谓点差分,就是指给定一段树上的链,执行修改操作。此时需要的是$$dif_u--,dif_v--,dif_{LCA(u,v)} --,dif_{father(LCA(u,v)}--$$跟边差分不同的是,我们现在每个点的\(dif\)是为了点服务的,所以我们的\(LCA\)也应当算上,那么就不能 \(-= 2\),而是转而对\(father(LCA)\)进行操作。

那么最后就是标准的\(dfs\)统计了,随便乱搞就行。

#include <cmath>
#include <cstdio>
#include <iostream>
#define MAXN 200010 using namespace std ;
struct edge{
int to, next ;
}e[MAXN << 1]; int head[MAXN], cnt ;
int N, M, A, B, C, i, j, Up, pre, res ;
int dif[MAXN], fa[MAXN][32], dep[MAXN], ans[MAXN] ; inline int qr(){
int k = 0 ; char c = getchar() ;
while(!isdigit(c)) c = getchar() ;
while(isdigit(c)) k = (k << 1) + (k << 3) + c - 48, c = getchar() ;
return k ;
}
inline void add(int u, int v){
e[++ cnt].to = v ;
e[cnt].next = head[u] ;
head[u] = cnt ;
}
void _build(int deep, int now, int f){
fa[now][0] = f ; dep[now] = deep ;
for(int k = head[now]; k ;k = e[k].next){
if(e[k].to == f) continue ;
_build(deep + 1, e[k].to, now) ;
}
}
void _get(int now){
for(int k = head[now]; k ; k = e[k].next){
if(e[k].to == fa[now][0]) continue ;
_get(e[k].to) ;
dif[now] += dif[e[k].to] ;
}
res = max(res, dif[now]) ;
}
inline void init(){
Up = log(N) / log(2) + 1 ;
for(i = 1; i <= Up; i ++)
for(j = 1; j <= N; j ++)
fa[j][i] = fa[fa[j][i - 1]][i - 1] ;
}
inline int LCA(int u, int v){
if(dep[u] < dep[v]) swap(u, v) ;
pre = dep[u] - dep[v] ;
for(j = 0; j <= Up; j ++) if((1 << j) & pre) u = fa[u][j] ;
if(u == v) return u ;
for(j = Up; j >= 0; j --) if(fa[u][j] != fa[v][j]) u = fa[u][j], v = fa[v][j] ;
return fa[v][0] ;
}
int main(){
cin >> N >> M ;
for(i = 1; i < N; i ++) A = qr(), B = qr(), add(A, B), add(B, A) ;
_build(1, 1, 0) ; init() ;
for(i = 1; i <= M; i ++){
A = qr(), B = qr(), C = LCA(A, B);
dif[A] ++, dif[B] ++ ;
dif[C] --, dif[fa[C][0]] -- ;
}
_get(1) ; cout << res ; return 0 ;
}

树上差分学习笔记 + [USACO15DEC]最大流$Max \ \ Flow \ \ By$的更多相关文章

  1. 【学术篇】树上差分--洛谷3128最大流Max Flow

    懒得贴题目,直接放不稳定的传送门(雾):点击前往暴风城(雾) 据说这题是BZOJ3490,但本蒟蒻没有权限╮(╯_╰)╭ 这题似乎就是裸树上差分... 对于树上(x,y)之间的路径上的点区间c[i]加 ...

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

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

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

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

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

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

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

    题意 题目链接 Sol 树上差分模板题 发现自己傻傻的分不清边差分和点差分 边差分就是对边进行操作,我们在\(u, v\)除加上\(val\),同时在\(lca\)处减去\(2 * val\) 点差分 ...

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

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

  7. [USACO15DEC]最大流Max Flow(树上差分)

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

  8. 洛谷3128 [USACO15DEC]最大流Max Flow——树上差分

    题目:https://www.luogu.org/problemnew/show/P3128 树上差分.用离线lca,邻接表存好方便. #include<iostream> #includ ...

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

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

随机推荐

  1. linq中如何实现多个条件的联合查询

    目前接触处理数据这一块比较多,在处理内存中的数据源的时候我一般使用的是linq,linq使用起来像sql语句一样,用法简单,功能强大. 最近需要实现一个从两个不同的文件读取不同的数据,然后根据这两个数 ...

  2. 转:ubuntu 18.04 LTS 安装 java10(JDK) 及问题说明

    原文地址:ubuntu 18.04 LTS 安装 java10 及问题说明 1.下载相应的安装包,例如jdk-10.0.1_linux-x64_bin.tar.gz.下载地址: http://www. ...

  3. 实用的Javascript获取网页屏幕可见区域高度

    本文转载原地址:这里 document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 docu ...

  4. 【Python】Java程序员学习Python(十)— 类、包和模块

    我觉得学习到现在应该得掌握Python的OOP编程了,但是现在还没有应用到,先留一个坑. 一.类和对象 说到类和对象其实就是在说面向对象编程,学完Java以后我觉得面向对象编程还是很不错的,首先封装了 ...

  5. Oracle EBS 数据访问权限集

    SELECT frv.responsibility_name, fpo.profile_option_name, fpo.user_profile_option_name, fpv.profile_o ...

  6. C#实现ADH815通讯

    最近在做自提柜项目,考虑到ADH815电路板在自助售卖行业的通用性.把通讯代码贴出来了. 下载地址

  7. 关于Entity Framework关系配置,提示列名XXXX_Id无效的问题

    问题描述 : 数据库中有两张表,如下: Member(会员)表有外键RoleId,对应的是Role(角色)表的主键Id,业务逻辑是Member表的RoleId必须与Role表的Id对应(但在设计数据表 ...

  8. 在asp.net一般应用程序中使用session

    通常我们经常,通过session判定用户是否登录.还有一些临时的.重要的数据也尝尝存放在Session中. 在页面我们很容易的得到Session的值,但在类中就会遇到一些问题.也知道通过下面的方法得到 ...

  9. CSS学习摘要-盒子模型

    注:全文摘要自网络开发者网站,当然间隔也会整理一些思路和格式排版添加进去. CSS框模型(译者注:也被称为"盒模型")是网页布局的基础 --每个元素被表示为一个矩形的方框,框的内容 ...

  10. November 21st 2016 Week 48th Monday

    A bird is known by its note, and a man by his talk. 闻其声而知鸟,听其言而知人. Listen to what a man talks, watch ...