[USACO15DEC]最大流Max Flow(树链剖分,线段树)
FJ给他的牛棚的N(2≤N≤50,000)个隔间之间安装了N-1根管道,隔间编号从1到N。所有隔间都被管道连通了。
FJ有K(1≤K≤100,000)条运输牛奶的路线,第i条路线从隔间si运输到隔间ti。一条运输路线会给它的两个端点处的隔间以及中间途径的所有隔间带来一个单位的运输压力,你需要计算压力最大的隔间的压力是多少。
思路:
比较基础的树剖题
对于每条线路
我们维护一个区间最大值的线段树
通过树剖实现每个加1的操作
最后读取总最大值就好
代码:
// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#define rii register int i
#define rij register int j
using namespace std;
int fa[],top[],size[],nid[];
int head[],n,k,bnt,cnt,sd[],wes[];
struct ljb{
int to,nxt;
}y[];
struct tree{
int maxn,lazy;
}x[];
inline int rd(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {f=ch=='-'?:;ch=getchar();}
while(isdigit(ch)) {x=(x<<)+(x<<)+ch-'';ch=getchar();}
return f?x:-x;
}
inline void add(int from,int to)
{
bnt++;
y[bnt].to=to;
y[bnt].nxt=head[from];
head[from]=bnt;
}
inline void pushdown(int bh)
{
x[bh*].lazy+=x[bh].lazy;
x[bh*].maxn+=x[bh].lazy;
x[bh*+].lazy+=x[bh].lazy;
x[bh*+].maxn+=x[bh].lazy;
x[bh].lazy=;
}
void addjl(int l,int r,int nl,int nr,int bh)
{
if(l<nl)
{
l=nl;
}
if(r>nr)
{
r=nr;
}
if(l==nl&&r==nr)
{
x[bh].lazy++;
x[bh].maxn++;
return;
}
if(x[bh].lazy!=)
{
pushdown(bh);
}
int mid=(nl+nr)/;
if(l<=mid)
{
addjl(l,r,nl,mid,bh*);
}
if(r>mid)
{
addjl(l,r,mid+,nr,bh*+);
}
x[bh].maxn=max(x[bh*].maxn,x[bh*+].maxn);
}
void dfs1(int wz,int nfa,int nsd)
{
fa[wz]=nfa;
sd[wz]=nsd;
size[wz]=;
int maxn=;
for(rii=head[wz];i!=;i=y[i].nxt)
{
int to=y[i].to;
if(to!=nfa)
{
dfs1(to,wz,nsd+);
size[wz]+=size[to];
if(size[to]>maxn)
{
wes[wz]=to;
maxn=size[to];
}
}
}
}
void dfs2(int wz,int ntop)
{
cnt++;
nid[wz]=cnt;
top[wz]=ntop;
if(wes[wz]==)
{
return;
}
dfs2(wes[wz],ntop);
for(rii=head[wz];i!=;i=y[i].nxt)
{
int to=y[i].to;
if(wes[wz]!=to&&fa[wz]!=to)
{
dfs2(to,to);
}
}
}
void addlj(int from,int to)
{
while(top[from]!=top[to])
{
if(sd[top[from]]<sd[top[to]])
{
swap(from,to);
}
addjl(nid[top[from]],nid[from],,n,);
from=fa[top[from]];
}
if(sd[from]>sd[to])
{
swap(from,to);
}
addjl(nid[from],nid[to],,n,);
from=fa[top[from]];
}
int main()
{
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
n=rd(),k=rd();
for(rii=;i<n;i++)
{
int from,to;
from=rd(),to=rd();
add(from,to);
add(to,from);
}
dfs1(,,);
dfs2(,);
for(rii=;i<=k;i++)
{
int from,to;
from=rd(),to=rd();
addlj(from,to);
}
cout<<x[].maxn;
}
[USACO15DEC]最大流Max Flow(树链剖分,线段树)的更多相关文章
- 【BZOJ-2325】道馆之战 树链剖分 + 线段树
2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1153 Solved: 421[Submit][Statu ...
- POJ3237 (树链剖分+线段树)
Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...
- Aizu 2450 Do use segment tree 树链剖分+线段树
Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...
- B20J_3231_[SDOI2014]旅行_树链剖分+线段树
B20J_3231_[SDOI2014]旅行_树链剖分+线段树 题意: S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,城市信仰不同的宗教,为了方便,我们用不同的正整数代表各种宗教. S国 ...
- bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2852 Solved: 1668[Submit][Sta ...
- 洛谷P4092 [HEOI2016/TJOI2016]树 并查集/树链剖分+线段树
正解:并查集/树链剖分+线段树 解题报告: 传送门 感觉并查集的那个方法挺妙的,,,刚好又要复习下树剖了,所以就写个题解好了QwQ 首先说下并查集的方法趴QwQ 首先离线,读入所有操作,然后dfs遍历 ...
- BZOJ2325[ZJOI2011]道馆之战——树链剖分+线段树
题目描述 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中 的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个冰地的楼梯才 ...
- BZOJ4127Abs——树链剖分+线段树
题目描述 给定一棵树,设计数据结构支持以下操作 1 u v d 表示将路径 (u,v) 加d 2 u v 表示询问路径 (u,v) 上点权绝对值的和 输入 第一行两个整数n和m,表示结点个数和操作数 ...
- BZOJ2157旅游——树链剖分+线段树
题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路 ...
- POJ3237 Tree 树链剖分 线段树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ3237 题意概括 Description 给你由N个结点组成的树.树的节点被编号为1到N,边被编号为1 ...
随机推荐
- The pit of an if statement in Java
package the.pit.of.an.ifstatement.injava; public class ThePitOfAnIfStatementInJava { public static v ...
- centos7上安装python3
一.安装环境及版本 CentOS 6.5 Python 3.6.1 二.安装依赖包 1.安装静态库 # yum install -y openssl-static 注:如果不安装该静态库,会导致pyt ...
- 对于大型公司项目平台选择j2ee的几层认识
我是一个从野路子上一路走来的程序员,现在主要用.net做方案.选.net不选jave并没有什么特别的原因,只不过是因为我自己从c,java学起,后来被vs这个工具所吸引, 很熟悉这个平台罢了,从业15 ...
- python之复数
#coding=utf8 ''''' 复数是由一个实数和一个虚数组合构成,表示为:x+yj 一个负数时一对有序浮点数(x,y),其中x是实数部分,y是虚数部分. Python语言中有关负数的概念: 1 ...
- 面向对象进阶------>内置函数 str repr new call 方法
__new__方法: 我们来讲个非常非常重要的内置函数和init一样重要__new__其实在实例话对象的开始 是先继承父类中的new方法再执行init的 就好比你生孩子 先要把孩子生出来才能对孩子 ...
- 模拟代理安装---User-Agent Switcher for Chrome安装
模拟代理安装: 1. 百度User-Agent Switcher for Chrome进行下载 2. 直接安装 1. 进入扩展程序界面 2. 拖动插件进行安装 3.安装成功后会显示一个插件标志,里面可 ...
- Scala模式匹配和样例类
Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句.类型检查等.并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配. 1.字符匹配 def mai ...
- Who are you, What is the science
Please read: 地球月球有多大? 我们乃至我们赖以生存的地球, 甚至是我们硕大的银河系放到茫茫大宇中真的不过是一粒尘埃, 我们司空见惯的事物,我们习以为常的生活,我们笃定信奉的科学, 是不 ...
- js oc与线程
分属不同的线程 //定义需要暴露给js的内容,这里我们只暴露personName和queryPersonName接口 @protocol PersonProtocol <JSExport> ...
- gluoncv 下载预训练模型速度太慢
export MXNET_GLUON_REPO=https://apache-mxnet.s3.cn-north-1.amazonaws.com.cn https://discuss.gluon.ai ...