传送门

这是个假的最大流,其实是一个用树剖+线段树就能解决的事情

题目中的道路会对路径上的造成压力,最后询问最大的压力

其实就等价于对每条路径上的点加上 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的更多相关文章

  1. 洛谷 P3128 [USACO15DEC]最大流Max Flow-树上差分(点权/点覆盖)(模板题)

    因为徐州现场赛的G是树上差分+组合数学,但是比赛的时候没有写出来(自闭),背锅. 会差分数组但是不会树上差分,然后就学了一下. 看了一些东西之后,对树上差分写一点个人的理解: 首先要知道在树上,两点之 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. P3128 [USACO15DEC]最大流Max Flow

    思路 这个题哪里有那么费脑筋 我们可以树链剖分嘛LCT昨天学的时候睡着了,不是太会 两遍dfs+一个5行的BIT 其实树链剖分学好了对倍增和LCT理解上都有好处 一条路径上的修改 由于一条剖出来的链是 ...

随机推荐

  1. MongoDB 4.0.* 远程连接及用户名密码认证登陆配置——windows

  2. 搭建Eureka注册中心

    创建一个Spring Boot工程,命名为eureka-server,并在pom.xml中引入必要的依赖,代码如下. <parent> <groupId>org.springf ...

  3. element vue 表格编辑

    https://xuliangzhan.github.io/vue-element-extends/#/editable/click1

  4. Linux查看用户所属用户组

    1.查看当前用户所属用户组 [oracle@serverhl ~]$ groups oinstall dba 2.查看<user1>, <user2> 和 <user3& ...

  5. C语言函数-socket

    int sock = socket(AF_INET, SOCK_STREAM, 0) //建立一个流式套接字,stream是流的意思,Tcp连接,提供序列化的.可靠的.双向连接的字节流.支持带外数据传 ...

  6. 理解vue 修饰符sync

    也是在vux中看到了这个sync 现在我们来看看vue中的sync 我们先看下官方文档:vue .sync 修饰符,里面说vue .sync 修饰符以前存在于vue1.0版本里,但是在在 2.0 中移 ...

  7. 第三篇--创建.gitignore文件

    小知识 ·  git add -A  提交所有变化 ·  git add -u  提交被修改(modified)和被删除(deleted)文件,不包括新文件(new) ·  git add .  提交 ...

  8. 属性的get、set

    以年龄为例,通过属性,控制年龄的输入范围. 静态调用非静态时,需要通过对象来调用. namespace ConsoleApplication1 { class Program { private in ...

  9. Python学子之如何退出python 命令行

    python命令行是新手学习python过程中必须要学的一个工具,下面我们来看一下怎么退出python命令行. 工具/原料 python2.7 方法/步骤 1.我们这里使用的是python3.6版本, ...

  10. Angular+Ionic+RSA实现后端加密前端解密功能

    因业务需要,需要给android应用安装证书,通过读取证书文件内容实现某些功能的控制: 流程:后台通过publicKey对指定内容的文件进行加密,生成文件共客户下载,客户下载后选择该证书文件读取到应用 ...