网络流
拆点/拆边技巧
题目来源
bzoj1070
题目描述
同一时刻有\(N\)位车主带着他们的爱车来到了汽车维修中心。维修中心共有\(M\)位技术人员,不同的技术人员对不同
的车进行维修所用的时间是不同的。现在需要安排这\(M\)位技术人员所维修的车及顺序,使得顾客平均等待的时间最小。
说明:
1.顾客的等待时间是指从他把车送至维修中心到维修完毕所用的时间。
2.可以支持不同的技术人员同时修车。也就是说,可以理解成\(N\)位车主在\(M\)位技术人员那里排好队,然后\(M\)位技术人员同时完成他们的任务。
约束条件
\(2 \leq M \leq 9,1 \leq N \leq 60,1 \leq T \leq 1000\)
时间限制:1s
空间限制:512MB
最小割模型的转换
题目来源
(bzoj1934)
题目描述
幼儿园里有\(n\)个小朋友打算通过投票来决定睡不睡午觉。对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神。虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投和自己本来意愿相反的票。我们定义一次投票的冲突数为\(m\)对好朋友之间发生冲突的总数加上和所有和自己本来意愿发生冲突的人数。 我们的问题就是,每位小朋友应该怎样投票,才能使冲突数最小?
约束条件
\(2 \leq n \leq 300,1 \leq m \leq n(n-1)/2\)
高级专题
题目来源
(bzoj3502)
题目描述
给定一个长为\(n\)的数列,要求选出最多\(k\)个不相交的区间(可以不选),使得选中的数字之和最大。
约束条件
\(1 \leq k \leq n \leq 1000000\)
时间限制:3s
空间限制:512MB
注:其实这里还有一些技巧没有用题目覆盖到:
1.最小割的构造
2.最大权闭合子图,最大密度子图的做法
3.上下界网络流
4.哪些边必定在最小割/可能在最小割/一定不在最小割里面(bzoj1797)
5.二分图相关的各种问题
5.1 二分图的最大独立集 = 点数 - 最大匹配
二分图最大独立集的构造也要会!
5.2 二分图的最小边覆盖集 = 最大匹配
5.3 二分图博弈问题 *
5.4 \(k\)正则的二分图必定有边的\(k\)染色,以及它们的构造方法
一个方法是每次找完美匹配删掉即可。
(https://atcoder.jp/contests/agc037/tasks/agc037_d)
5.5 一些涉及到网格图的题目,需要用它是二分图的性质来建模 *
5.5 二分图删点/删边匹配问题(https://loj.ac/problem/2276))
6.模拟费用流*
7.线性规划转网络流(bzoj1061) *
树上问题归纳
树形DP
题目来源
题目描述
外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY
已经联系好了黄金舰队,打算联合所有 JSOIer
抵御外星人的进攻。
在黄金舰队就位之前,JYY
打算事先了解外星人的进攻计划。现在,携带了监听设备的特工已经秘密潜入了外星人的母舰,准备对外星人的通信实施监听。
外星人的母舰可以看成是一棵 \(n\)个节点,\(n - 1\) 条边的无向树,树上的节点用 编号。JYY
的特工已经装备了隐形模块,可以在外星人母舰中不受限制地活动,可以神不知鬼不觉地在节点上安装监听设备。
如果在节点 上安装监听设备,则 JYY
能够监听与 直接相邻所有的节点的通信。换言之,如果在节点 安装监听设备,则对于树中每一条边 ,节点 都会被监听。特别注意放置在节点 的监听设备并不监听 本身的通信,这是 JYY
特别为了防止外星人察觉部署的战术。
JYY
的特工一共携带了 个监听设备,现在 JYY
想知道,有多少种不同的放置监听设备的方法,能够使得母舰上所有节点的通信都被监听?为了避免浪费,每个节点至多只能安装一个监听设备,且监听设备必须被用完。
约束条件
\(1 \leq n \leq 10^5, 1 \leq k \leq \min(n, 100)\)
树形DP的本质是合并两棵子树的信息
树形DP除了设子树点数这个状态,还经常补充该点的状态,它父亲的状态,子树内选的点数等信息
优化树形DP就是以尽量好的复杂度做两棵子树的合并
树链剖分/dfs序
题目来源
题目描述
Linux 用户和 OSX 用户一定对软件包管理器不会陌生。通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软件包的安装所依赖的其它软件包),完成所有的配置。Debian/Ubuntu 使用的 apt-get,Fedora/CentOS 使用的 yum,以及 OSX 下可用的 Homebrew 都是优秀的软件包管理器。
你决定设计你自己的软件包管理器。不可避免地,你要解决软件包之间的依赖问题。如果软件包\(B\) 依赖软件包 \(A\),那么安装软件包 \(B\)以前,必须先安装软件包\(A\) 。同时,如果想要卸载软件包\(B\) ,则必须卸载软件包\(A\) 。现在你已经获得了所有的软件包之间的依赖关系。而且,由于你之前的工作,除 \(0\)号软件包以外,在你的管理器当中的软件包都会依赖一个且仅一个软件包,而 \(0\)号软件包不依赖任何一个软件包。依赖关系不存在环(若有 \(m\)个软件包,其中 \(A_1\)依赖\(A_2\) , \(A_2\)依赖\(A_3\) , \(A_3\)依赖\(A_4\) ,……, \(A_{m - 1}\)依赖\(A_m\) ,而 \(A_m\)依赖\(A_1\) ,则称这 \(m\)个软件包的依赖关系构成环),当然也不会有一个软件包依赖自己。
现在你要为你的软件包管理器写一个依赖解决程序。根据反馈,用户希望在安装和卸载某个软件包时,快速地知道这个操作实际上会改变多少个软件包的安装状态(即安装操作会安装多少个未安装的软件包,或卸载操作会卸载多少个已安装的软件包),你的任务就是实现这个部分。注意,安装一个已安装的软件包,或卸载一个未安装的软件包,都不会改变任何软件包的安装状态,即在此情况下,改变安装状态的软件包数为 \(0\)。
输入文件的第 行包含 \(1\)个正整数\(n\) ,表示软件包的总数。软件包从\(0\) 开始编号。
随后一行包含\(n - 1\) 个整数,相邻整数之间用单个空格隔开,分别表示 \(1, 2, …, n - 1\)号软件包依赖的软件包的编号。
接下来一行包含一个正整数 ,表示询问的总数。
之后 行,每行一个询问。询问分为两种:install x
:表示安装软件包uninstall x
:表示卸载软件包
你需要维护每个软件包的安装状态,一开始所有的软件包都处于未安装状态。对于每个操作,你需要输出这步操作会改变多少个软件包的安装状态,随后应用这个操作(即改变你维护的安装状态)。
约束条件
\(1 \leq n, q \leq 100000\)
树链剖分,dfs序的本质都是把树上问题转换为区间问题!对于静态的问题,重链先行dfs序是较为通用的
别的例题: https://www.luogu.com.cn/problem/P2486
注:这里也还有一些技巧没有用题目覆盖到:
1.树上贪心问题 (https://loj.ac/problem/3052)
2.点分治/链分治的应用
2.1 做树链统计的问题,例如统计有多少条长度 \(\leq x\) 的路径 (bzoj1468)
2.2 动态dp问题 *
3.树上启发式合并/线段树合并问题
3.1 也用来做树链统计的问题,可以与点分治联系起来
3.2 用来做数据结构题 (bzoj2733,ONTAK 2010 Peaks)
3.3 用来优化树形dp * (https://loj.ac/problem/2568)
4.图论与树的结合
4.1 最小生成树/最小瓶颈路 (https://loj.ac/problem/2610)
4.2 动态加边维护最小生成树 (https://loj.ac/problem/2245,)
4.3 点双树,边双树 (https://loj.ac/problem/2587)
4.4 dfs树及其应用 (之前zbw和我在题目中都涉及到了一点)
5.动态树问题 (https://www.luogu.com.cn/problem/P3203)
6.2018到2019考过3次的树上最优化问题(有时涉及到多棵树的处理)*
7.树的计数问题 *
考试技巧
(先咕着,有空再更)