USACO15DEC最大流MaxFlow
这是个假的最大流,其实是一个用树剖+线段树就能解决的事情
题目中的道路会对路径上的造成压力,最后询问最大的压力
其实就等价于对每条路径上的点加上 1 的权值,并且最后询问整个树中的最大值
然后树剖+最大值线段树裸题,完事,莫得别的问题了.
\(Updated:\)
其实,可以树上差分+遍历解决的吧...当时好像有点学数据结构学傻了
Code:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <vector>
#define ls ( rt << 1 )
#define rs ( rt << 1 | 1 )
#define mid ( ( l + r ) >> 1 )
#define pushup(rt) t[rt].data = max ( t[ls].data , t[rs].data )
using std::vector ;
using std::max ;
const int N = 1e5 + 5 ;
struct seg {
int left , right , data , tag ;
inline int size () { return right - left + 1 ; }
}t[(N<<2)] ;
vector < int > G[N] ;
int n , k , val[N] , son[N] , idx[N] , ans ;
int tot , deep[N] , f[N] , siz[N] , top[N] ;
inline void dfs ( int cur , int anc , int dep ) {
f[cur] = anc ; deep[cur] = dep ; siz[cur] = 1 ;
int maxson = - 1 ; for ( int k : G[cur] ) {
if ( k == anc ) continue ;
dfs ( k , cur , dep + 1 ) ; siz[cur] += siz[k] ;
if ( siz[k] > maxson ) maxson = siz[k] , son[cur] = k ;
}
return ;
}
inline void _dfs ( int cur , int topf ) {
top[cur] = topf ; idx[cur] = ++ tot ; val[tot] = 0 ;
if ( ! son[cur] ) return ; _dfs ( son[cur] , topf ) ;
for ( int k : G[cur] ) {
if ( k == f[cur] || k == son[cur] ) continue ;
_dfs ( k , k ) ;
}
return ;
}
inline void build ( int rt , int l , int r ) {
t[rt].left = l ; t[rt].right = r ; t[rt].tag = 0 ;
if ( l == r ) { t[rt].data = val[l] ; return ; }
build ( ls , l , mid ) ; build ( rs , mid + 1 , r ) ;
pushup ( rt ) ; return ;
}
inline void pushdown ( int rt ) {
t[ls].tag += t[rt].tag ; t[rs].tag += t[rt].tag ;
t[ls].data += t[rt].tag ; t[rs].data += t[rt].tag ;
t[rt].tag = 0 ; return ;
}
inline void update ( int rt , int ll , int rr , int key ) {
int l = t[rt].left , r = t[rt].right ;
if ( ll <= l && r <= rr ) {
t[rt].tag += key ;
t[rt].data += key ;
return ;
}
if ( t[rt].tag != 0 ) pushdown ( rt ) ;
if ( ll <= mid ) update ( ls , ll , rr , key ) ;
if ( rr > mid ) update ( rs , ll , rr , key ) ;
pushup ( rt ) ; return ;
}
inline void query ( int rt , int ll , int rr ) {
int l = t[rt].left , r = t[rt].right ;
if ( ll <= l && r <= rr ) {
ans = max ( ans , t[rt].data ) ;
return ;
}
if ( t[rt].tag != 0 ) pushdown ( rt ) ;
if ( ll <= mid ) query ( ls , ll , rr ) ;
if ( rr > mid ) query ( rs , ll , rr ) ;
return ;
}
inline void uprange (int x , int y , int key) {
while ( top[x] != top[y] ) {
if ( deep[top[x]] < deep[top[y]] ) std::swap ( x , y ) ;
update ( 1 , idx[top[x]] , idx[x] , key ) ; x = f[top[x]] ;
}
if ( deep[x] > deep[y] ) std::swap ( x , y ) ;
update ( 1 , idx[x] , idx[y] , key ) ; return ;
}
int main () {
scanf ("%d%d" , & n , & k ) ;
for (int i = 1 ; i < n ; ++ i) {
register int u , v ;
scanf ("%d%d" , & u , & v ) ;
G[u].push_back ( v ) ;
G[v].push_back ( u ) ;
}
dfs ( 1 , 0 , 1 ) ; _dfs ( 1 , 1 ) ; build ( 1 , 1 , tot ) ;
while ( k -- ) {
register int u , v ;
scanf ("%d%d" , & u , & v ) ;
uprange ( u , v , 1 ) ;
}
ans = - 1 ; query ( 1 , idx[1] , idx[1] + siz[1] - 1 ) ;
printf ("%d\n" , ans ) ; system ("pause") ; return 0 ;
}
USACO15DEC最大流MaxFlow的更多相关文章
- 洛谷 P3128 [USACO15DEC]最大流Max Flow-树上差分(点权/点覆盖)(模板题)
因为徐州现场赛的G是树上差分+组合数学,但是比赛的时候没有写出来(自闭),背锅. 会差分数组但是不会树上差分,然后就学了一下. 看了一些东西之后,对树上差分写一点个人的理解: 首先要知道在树上,两点之 ...
- 洛谷P3128 [USACO15DEC]最大流Max Flow
P3128 [USACO15DEC]最大流Max Flow 题目描述 Farmer John has installed a new system of N-1N−1 pipes to transpo ...
- P3128 [USACO15DEC]最大流Max Flow(LCA+树上差分)
P3128 [USACO15DEC]最大流Max Flow 题目描述 Farmer John has installed a new system of pipes to transport mil ...
- luoguP3128 [USACO15DEC]最大流Max Flow 题解(树上差分)
链接一下题目:luoguP3128 [USACO15DEC]最大流Max Flow(树上差分板子题) 如果没有学过树上差分,抠这里(其实很简单的,真的):树上差分总结 学了树上差分,这道题就极其显然了 ...
- 洛谷P3128 [USACO15DEC]最大流Max Flow [倍增LCA]
题目描述 Farmer John has installed a new system of pipes to transport milk between the stalls in his b ...
- 洛谷P3128 [USACO15DEC]最大流Max Flow [树链剖分]
题目描述 Farmer John has installed a new system of pipes to transport milk between the stalls in his b ...
- luogu P3128 [USACO15DEC]最大流Max Flow (树上差分)
题目描述 Farmer John has installed a new system of N-1N−1 pipes to transport milk between the NN stalls ...
- 树上差分——点差分裸题 P3128 [USACO15DEC]最大流Max Flow
讲解: https://rpdreamer.blog.luogu.org/ci-fen-and-shu-shang-ci-fen #include <bits/stdc++.h> #def ...
- P3128 [USACO15DEC]最大流Max Flow
思路 这个题哪里有那么费脑筋 我们可以树链剖分嘛LCT昨天学的时候睡着了,不是太会 两遍dfs+一个5行的BIT 其实树链剖分学好了对倍增和LCT理解上都有好处 一条路径上的修改 由于一条剖出来的链是 ...
随机推荐
- Python进阶7--正则表达式
正则表达式*** 概述 分类 基本语法 元字符 ^ 匹配字符串的开头 $ 匹配字符串的末尾. . 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符. [.. ...
- bzoj4785:[ZJOI2017]树状数组:二维线段树
分析: "如果你对树状数组比较熟悉,不难发现可怜求的是后缀和" 设数列为\(A\),那么可怜求的就是\(A_{l-1}\)到\(A_{r-1}\)的和(即\(l-1\)的后缀减\( ...
- mysql8.0 Server 在Windows平台中的安装、初始化和远程访问设置
mysql8.0 server安装 1.下载mysql 8.0 可以到mysql官网下载 https://dev.mysql.com/downloads/mysql 或者如下地址 mysql-8.0. ...
- YApi二次开发环境部署
YApi 是去哪儿网大前端技术中心开源的一个可视化的接口管理平台.下面是在CentOS7下搭建二次开发环境步骤. 1 安装MongoDB 具体安装参考CentOS7安装MongoDB 2 安装Node ...
- PHP——秒数转换为时分秒
前言 通讯记录需要用到的一个方法,就是将秒转为时分秒 方法 PHP有内置的方法,直接用即可,不过这个只是24小时以内.对于通讯录来说是够用了~ 示例 $v = 30; gmdate('H:i:s', ...
- P1006 传纸条 (方格取数dp)
题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个mm行nn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运 ...
- 20165223《网络对抗技术》Exp4 恶意代码分析
目录 -- 恶意代码分析 恶意代码分析说明 实验任务目标 实验内容概述 schtasks命令使用 实验内容 系统运行监控 恶意软件分析 静态分析 virscan分析和VirusTotal分析 PEiD ...
- kubernetes学习第一篇-k8s安装以及HelloWorld
安装 1. 关闭防火墙服务 # systemctl disable firewalld # systemctl stop firewalld 2. 安装etcd以及kubernetes软件 yum i ...
- 使用Excel VBA编程将网点的百度坐标转换后标注到高德地图上
公司网点表存储的坐标是百度坐标,现需要将网点位置标注到高德地图上,研究了一下高德地图的云图数据模版 http://lbs.amap.com/yuntu/reference/cloudstorage和坐 ...
- JMeter 下载
测试文件下载接口,jmeter返回的是字节流,所以jmeter本身是不支持将文件保存到本地的 怎么判断服务器有没有完全返回?response header头里面有一个content-lenth,添加断 ...