[笔记] APIO 2018 Day1
计算折纸
computaional origami
全息算法(???)
margulis napkin problem
素数里有任意长的等差数列
xor gate Σxi
or gate(exact version) 1-π(1-xi)
or gate(approximate versiton) :Randomly pick r1,r2,…,rn, calc Σrixi
correct with probability 1/2·
AC0电路
泊松算法
二分
两个长度为n的数组a,b,求ai*bj中第k小的数
排序a,b,二分第k个数的数值x,统计比x小的数个数
双指针扫描
2n-1宽的金字塔,除底层外每个位置是下面三个数的中位数,求塔顶数是多少
二分顶端数,转换为01序列
长度为n的序列,每个数在[1,n],m次操作,将一个区间升序排序,最后询问一次第x个数
二分,转换01序列
线段树,区间赋值,区间查询
n点,m边,有向图,每条边边权wi,求一个环使环上平均边权最大
二分平均值,边减去平均值,spfa判正环
n点m边,子图优美度=边数/点数,求最大优美程度
二分,最大权闭合子图
带权二分
解决带k限制的东西(如某东西只能用k次)
n点,m边,无向带权联通图,黑边或白边,求一颗最小权的恰有k条白色边的生成树
n<=50000,m<=100000,所有数据边权为[1,100]的正整数
对白边增加INF,最小生成树会得到一个白色尽量少树,对白边减去INF,得到白色边尽量多的树,
因此,有单调性。
给白色边增加C,C∈[-M*MaxW,M*MaxW]
如果某个c下,刚好得到k条边,就是最优解。
(注意c增加,白色边数单调不增,如555533310)
将长度为n的非负序列分割为k+l个非空子序列,每次ans+=两个序列中元素和的乘积
[APIO2014][SDOI2016]
1. O(nk) 斜率优化
2. 给每次划分加上代价c,当C=inf,只分一段,当c=0,分n段
所以有单调性,分段随c的增加而减少
Ans=Σxi^2-(每一段内任意两个数两两权值乘积)
然后斜率DP
O(nlogV)
n点树,有边权,用不超过k条边不相交的链覆盖,最小化未覆盖边长度之和+使用的链的条数*D
判断不限次数,额外代价为D时最优解的段数是否超过K,如果没有的话得到最优解。
否则,D的设置形同虚设,因为我们一定有k段。
然后就变成一个简单的二分+树上DP了
图的匹配及应用
kiana810@126.com
清华大学 何昊天
匹配中的边称为匹配边,其他为非匹配边
和匹配边相邻的为匹配点,其余为非匹配点
二分图用网络流+超级源汇解决
一般图做不到,原因:存在奇环
交错路:给出一个图和一个匹配,匹配边和非匹配边相错的路径
性质:把其中的匹配边和非匹配边取反,仍是合法匹配
增广路:两个端点都是未匹配点的交错路
取反后匹配边+1
匹配数=匹配点数/2
增广路定理:给定图和匹配,若不存在增广路,则该匹配就是极大匹配
选择公理(?)
拟阵(证明克鲁斯卡尔,证明增广路定理)
图论证法:
增广路引理:给定一张图和一个匹配,从一个未匹配点出发找不到增广路,则原图一定存在一个最大匹配,使得其不包含这个点,换句话说,我们删去这个点依然能找到原图的一个最大匹配
证明:匹配为M,存在一个未匹配点u,从u出发找不到增广路,该图有一个最大匹配M’
若u不是M’匹配点,得证
若u是M’匹配点,则构造另一个最大匹配使得u不是匹配点
对称差:(A△B=(A∪B)-(A∩B))
考虑M和M’的对称差N,这不一定是匹配,但其中仅有M的匹配边和M’中的匹配边和无关边
假设u在M中不是匹配点,所以u在N中仍然保留了在M’的匹配边,假设匹配边另一端是v1
显然v1不可能和M’中其他的匹配边相邻,但是可能和M中的匹配边相邻,假如有这样的边,假设另一端为v2
以此类推,直到走到vk,使vk除了与vk-1通过匹配边相邻外,其余邻边都是无关的边
刚才的路径不可能重复经过一个节点vi两次(否则vi在某个匹配中一定有两条边,不可能)
其次,vk!=u,否则u不是M中的未匹配点
最后vk与vk-1之间的边一定是M中的匹配边,否则u到vk就有一条M中的增广路,矛盾
现在在M’中取反u到vk,注意到这是一条交错路,所以仍然是一个匹配
增广路定理的证明:
假设图中无增广路,则从任意未匹配点出发都找不到增广路,任选一个未匹配点,删去后仍然得到原图最大匹配,删完后原匹配仍是原匹配。递归使用增广路引理,得证。
==注意到这里没有使用二分图的性质,所以对一般图仍然成立==
对于一张二分图,枚举一个集合中的每个未匹配点,直接从未匹配点开始进行DFS,如果走到另一个集合中的未匹配点,说明发现增广路,直接取反,否则通过匹配边走回原集合
根据距离定义搜索树上距离根节点的点为偶点或奇点
对于一般图:
1. 偶点到奇点都是匹配边
2. 奇点到偶点是匹配边
3. 偶点到偶点是匹配边
4. 不存在奇点到奇点的边,否则不形成交错路
偶点到偶点的边,会在搜索树上形成一个环,而且一旦穿越这条边,绕过一圈后环上的奇点都能成为偶点,那么它们将来可能延伸出更多交错路
一般图的花:
花(Blossom):搜索树上两条分叉的交错路通过偶点与偶点之间的边连成的奇数条边的环
花的问题在于,上面所有点都可以成为偶点,所以可以把花直接缩为一个偶点,称为缩花/开花(Blossom Contraction),这样搜索树的结构会更加清晰
在更复杂的图上花之间会有重叠,可谓百花齐放(笑),但注意我们的目的是化简搜索树找出增广路,所以缩花的顺序不影响,我们可以按任意顺序缩花。
实际操作中,只要遇到偶点到偶点的边马上缩花。
考虑缩花的次数,由于花上至少有三个点(奇环),所以每次缩花都会减少两个点,O(v)次缩花即可。
一般图的最大匹配
1. 从零开始枚举每个未匹配点
2. 对于一个未匹配点,按图的遍历走到另一个未访问的点x。若x是未匹配点,则已找到增广路,取反即可,否则继续拓展,走到对应的那个点,继续遍历
3. 走到访问过的奇点,直接返回
4. 略
缩花算法
花托(base):花上两条非匹配边衔接的点
形成花后,找到花托(即两个偶点在搜索树上的LCA)然后将花上的点全部缩为偶点,用并查集完成。
由于缩的点不再出现,对一棵搜索树的所有缩花操作,找花托O(V),最多O(V)次,瓶颈仍在遍历图O(E)上,再加上并查集的复杂度
以上为 带花树算法(Blossom Algorithm) O(VEα(V))
考虑优化,多路增广
对于二分图:
1. 从零匹配开始
2. 以一个集合的所有未匹配点为根,BFS建立搜索森林,每次拓展一层,找目前最短的增广路
3. 对弈另一个集合中的未匹配点,如果是搜索森林的叶子节点,则DFS返回具体增广路并取反,O(E)
4. 上述过程最多进行O(sqrt(V))轮
在前sqrt(V)轮,每一轮都找到并增广了最短的增广路,所以长度一定单调递增,那么这sqrt(V)轮后,剩余最短增广路长度最小sqrt(V)
考虑对称差
每进行一轮,最大匹配数最小增加1,所以再多执行sqrt(V)轮,就得到了最大匹配。
总复杂度O(Esqrt(V)) 这就是二分图匹配的Hopcroft-Karp算法
也就是对二分图用dinic的过程
对于一般图,用Micali-Vazirani算法多路增广达到O(Esqrt(V))
Konig定理:二分图最小点覆盖=最大匹配
证明:每条匹配边要选一个端点完成覆盖,所以最小点覆盖数不小于最大匹配数
接下来构造一个点覆盖数恰好等于最大匹配数的点覆盖:给未匹配点打标记,左侧标记点和右侧未标记点都是匹配点,所以C的大小恰好为最大匹配数
如果有边u-v未被覆盖,则u被标记v未被标记
如果u-v是匹配边,从u出发一定标记v,否则u-v是匹配边,当v匹配才可以
graph LR
A-->B
B-->G
G-->C
I-->D
D-->G
D-->H
H-->B
B-->E
B-->F
最大独立集定理:最小点覆盖数+最大独立集数=二分图定点数
在点覆盖的补集中,任意两个点之间不可能有边,否则不是匹配
三分图
**三分图**G=(V,E),V可以被划分为V1,V2,V3,满足三者∪为全集,∩为∅
两个三元组的交代表他们边集的交
如果两个三元组有交且不全等,则称这两个三元组相邻,与三元组 <u,v,w>
相邻的三元组数成为该三元组的度
记录o为G所有三元组集合,一个匹配M是o的一个子集,且满足M中不存在两个相交的三元组
o的连通子集称为三元组系列
对于G的两个匹配M和M’,Σ称为(M,M’)的交错三元组系列
如果还有{r|r∈Σ∩M}的大小等于{r|r∈Σ∩M’},则称Σ为增广三元组系列
增广路定理:M为G的最大(三分图)匹配的充要条件是G中不存在增广路
可以拓展到任意维度
拉格朗日松弛
[笔记] APIO 2018 Day1的更多相关文章
- 学习笔记--APIO 2018 二分专题 By wuvin
前言: 在APIO 2018 Day2下午听wuvin讲二分,听了一上午的神仙,现在终于有可以听懂了. 专题: 平均边权最大 题目链接:https://www.questoj.cn/problem/3 ...
- 「BalkanOI 2018 Day1」Election
「BalkanOI 2018 Day1」Election 记C为1,T为-1,\(sum[i]\)为\(i\)点的前缀和. 对于询问\([l,r]\),分两步计算答案. 要求所有点的\(sum[i]- ...
- 「BalkanOI 2018 Day1」Minmaxtree
「BalkanOI 2018 Day1」Minmaxtree 每个点都有一个最大和最小权值的限制. 然后每一个权值的限制都必须要取到. 每个点显然可以直接让他取到最大或最小权值. 可以想到每个点匹配一 ...
- RxJava2.0学习笔记2 2018年7月3日 周二
摘记: 1.map -- 转换 有些服务端的接口设计,会在返回的数据外层包裹一些额外信息,这些信息对于调试很有用,但本地显示是用不到的.使用 map() 可以把外层的格式剥掉,只留下本地会用到的核心 ...
- APIO 2018 游记
上接CTSC 2018 游记 day1 早上大概八九点起来洗了个澡跑到隔壁寝发现 tj 还在??? 原来昨天晚上听错名字了... 下午一起去 wfj 王府井玩,陪李总逛逛奢侈品店... 走了两三个小时 ...
- 《从零开始学Swift》学习笔记http(Day1)——我的第一行Swift代码
Swift 2.0学习笔记(Day1)——我的第一行Swift代码 原创文章,欢迎转载.转载请注明:关东升的博客 当第一次看到下面代码时我石化了,这些代码是什么东东?单词拼出来的? import Fo ...
- WC 2018/CTSC 2018/APIO 2018 游记
(要写CTSC的时候才想起来没写WC2018,那就粗略回顾一下吧hhhhh) WC 2018(简略版): 大概和 一个宁夏和一个天津的大哥一个宿舍hhhh,字典序分宿舍真是奇妙. WC讲课真的不是人听 ...
- 论文笔记:2018 PRCV 顶会顶刊墙展
Global Gated Mixture of Second-order Pooling for Imporving Deep Convolutional Neural Network(2018 NI ...
- BZOJ5465 : [APIO 2018] 选圆圈
假设最大的圆半径为$R$,以$2R$为大小将地图划分为一个个格子,那么每个圆只需要检查圆心在附近$9$个格子内部的所有圆. 在当前圆的半径不足$\frac{R}{2}$时重构网格,那么最多重构$O(\ ...
随机推荐
- UVa 1213 Sum of Different Primes (DP)
题意:给定两个数 n 和 k,问你用 k 个不同的质数组成 n,有多少方法. 析:dp[i][j] 表示 n 由 j 个不同的质数组成,然后先打表素数,然后就easy了. 代码如下: #pragma ...
- hdu4815 概率问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4815 好久没写dp了..最开始题意都理解错了, 哎!!我现在很饿也很困!! AC代码: #includ ...
- Ubuntu 14.04.1 配置 Android 源码开发环境(jdk版本切换)(转载)
转自:http://www.cnblogs.com/ren-gh/p/4248407.html # Ubuntu 14.04.1 1.更新源: sudo apt-get update 安装vim工具: ...
- 移动游戏By HYJ
暴力求SG函数即可,记忆化贼方便 /*program from Wolfycz*/ #include<cmath> #include<cstdio> #include<c ...
- 编译原理 LR分析(主要是LR(0)分析)
一.LR分析的基本原理 1.LR分析的基本思想 LR方法的基本思想就是,在规范归约的过程中,一方面要记住已移进和归约出的整个字符串,也就是说要记住历史:一方面能够根据所用的产生式的推测未来可能碰到的输 ...
- 贪心+模拟 ZOJ 3829 Known Notation
题目传送门 /* 题意:一串字符串,问要最少操作数使得成为合法的后缀表达式 贪心+模拟:数字个数 >= *个数+1 所以若数字少了先补上在前面,然后把不合法的*和最后的数字交换,记录次数 岛娘的 ...
- 题解报告:hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)
Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品, ...
- 循环队列 分类: c/c++ 2014-10-10 23:28 605人阅读 评论(0) 收藏
利用线性表实现队列,为了有效利用空间,将其设计为循环结构,防止假溢出:牺牲一个存储单元以区分队空.队满. 设front队头,rear队尾,N为顺序表大小 队空:rear==front 队满:(rear ...
- 二进制流BinaryFormatter存储读取数据的细节测试
二进制流的使用很方便,为了更好的理解应用它,我创建简单对象开始测试它的增加特性和减少特性. [Serializable] class Data----------开始时候的存储对象 { public ...
- [转]linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符)
本文转自:http://www.cnblogs.com/jack-liang/archive/2011/03/22/1991554.html Group By/Having操作符 适用场景:分组数据, ...