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理解上都有好处 一条路径上的修改 由于一条剖出来的链是 ...
随机推荐
- Centos 使用yum安装MongoDB 4.0
1.配置MongoDB的yum源 创建yum源文件: #cd /etc/yum.repos.d #vim mongodb-org-4.0.repo 添加以下内容:(我们这里使用阿里云的源) [mngo ...
- DS博客作业03--栈和队列
1.本周学习总结 本周学习中学习了栈和队列,栈和队列都属于线性结构,栈和队列不同于线性表的地方在于它们的相关运算具有一些特殊性,所以栈和队列也称为操作受限的线性表. 1.栈 栈是重要且常用的数据结构之 ...
- python学习日记(OOP数据封装)
class Student(object): def __init__(self,name,score): self.name = name self.score = score li = Stude ...
- [HNOI/AHOI2018]毒瘤
题目描述 https://www.lydsy.com/JudgeOnline/upload/201804/%E6%B9%96%E5%8D%97%E4%B8%80%E8%AF%95%E8%AF%95%E ...
- jdbc 连接各种数据库 CRUD
一,jdbc简介 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范(接口),称之为JDBC.这套接口由数据库厂商去实现,这样,开发人员只需要学习jdbc接口,并通过jdbc加 ...
- (二叉树 递归) leetcode94. Binary Tree Inorder Traversal
Given a binary tree, return the inorder traversal of its nodes' values. Example: Input: [1,null,2,3] ...
- kubernetes 核心技术概念(二)之 volume namespace annoation
volume k8s通过数据卷来提供pod数据的持久化,k8s的数据卷是对docker数据卷的扩展,k8s的数据卷是pod级别的,用来实现pod中容器的文件共享 volume是pod中能被多个容器访问 ...
- C++回顾day03---<string字符串操作>
一:string优点 相比于char*的字符串,C++标准程序库中的string类不必担心内存是否足够.字符串长度等等 而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下的需要. 二:str ...
- Ubuntu 划词翻译
在 Windows 下用 QTranslate 可以划词翻译,调用谷歌或百度翻译引擎,不需要本地词典. 在 Ubuntu 下可以自己写脚本实现一个简陋的版本. 步骤如下: 安装 xsel,sudo a ...
- request.getParameterValues 出现 [Ljava.lang.String;@ 错误
在实现简单的本地登录系统时,需要把page1.jsp的表单显示在page2.jsp中. 其中获取page1.jsp表单的办法就是在页面1的<form>中加入action="pag ...