计算折纸

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的更多相关文章

  1. 学习笔记--APIO 2018 二分专题 By wuvin

    前言: 在APIO 2018 Day2下午听wuvin讲二分,听了一上午的神仙,现在终于有可以听懂了. 专题: 平均边权最大 题目链接:https://www.questoj.cn/problem/3 ...

  2. 「BalkanOI 2018 Day1」Election

    「BalkanOI 2018 Day1」Election 记C为1,T为-1,\(sum[i]\)为\(i\)点的前缀和. 对于询问\([l,r]\),分两步计算答案. 要求所有点的\(sum[i]- ...

  3. 「BalkanOI 2018 Day1」Minmaxtree

    「BalkanOI 2018 Day1」Minmaxtree 每个点都有一个最大和最小权值的限制. 然后每一个权值的限制都必须要取到. 每个点显然可以直接让他取到最大或最小权值. 可以想到每个点匹配一 ...

  4. RxJava2.0学习笔记2 2018年7月3日 周二

    摘记: 1.map -- 转换  有些服务端的接口设计,会在返回的数据外层包裹一些额外信息,这些信息对于调试很有用,但本地显示是用不到的.使用 map() 可以把外层的格式剥掉,只留下本地会用到的核心 ...

  5. APIO 2018 游记

    上接CTSC 2018 游记 day1 早上大概八九点起来洗了个澡跑到隔壁寝发现 tj 还在??? 原来昨天晚上听错名字了... 下午一起去 wfj 王府井玩,陪李总逛逛奢侈品店... 走了两三个小时 ...

  6. 《从零开始学Swift》学习笔记http(Day1)——我的第一行Swift代码

    Swift 2.0学习笔记(Day1)——我的第一行Swift代码 原创文章,欢迎转载.转载请注明:关东升的博客 当第一次看到下面代码时我石化了,这些代码是什么东东?单词拼出来的? import Fo ...

  7. WC 2018/CTSC 2018/APIO 2018 游记

    (要写CTSC的时候才想起来没写WC2018,那就粗略回顾一下吧hhhhh) WC 2018(简略版): 大概和 一个宁夏和一个天津的大哥一个宿舍hhhh,字典序分宿舍真是奇妙. WC讲课真的不是人听 ...

  8. 论文笔记:2018 PRCV 顶会顶刊墙展

    Global Gated Mixture of Second-order Pooling for Imporving Deep Convolutional Neural Network(2018 NI ...

  9. BZOJ5465 : [APIO 2018] 选圆圈

    假设最大的圆半径为$R$,以$2R$为大小将地图划分为一个个格子,那么每个圆只需要检查圆心在附近$9$个格子内部的所有圆. 在当前圆的半径不足$\frac{R}{2}$时重构网格,那么最多重构$O(\ ...

随机推荐

  1. EF include 预先加载

    在asp.net mvc 中,常在控制器中预先加载导航属性,以便在视图中能够显示起关联的数据. 如果不预先加载,View中就会无法呈现外键的 关联数据. 会提示EF 错误发生. 一. 模型: publ ...

  2. JavaScript 算法与数据结构(转载)

    JavaScript 算法与数据结构 https://github.com/trekhleb/javascript-algorithms/blob/master/README.zh-CN.md

  3. (3)css文本样式

    本篇学习资料主要讲解: 如何用css 的样式定义方法来介绍文字的使用. 第(1)节:用css设置文本样式.                       一.弄懂文本文字的制作.利用css的样式定义版面 ...

  4. spring源代码下载并导入eclipse技巧

    环境:mac 安装brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install ...

  5. 有了Git这些操作,我再也不怕开发了!

    Git 是什么? Git 是一个分布式的代码管理容器,本地和远端都保有一份相同的代码. Git 仓库主要是由是三部分组成:本地代码,缓存区,提交历史. Git 有哪些常规操作? Git的常规操作你了解 ...

  6. python 匿名函数的使用(并没有那么简单)

    以下为几种匿名函数的使用方式:x=[(lambda x:x**2)(x) for x in range(10)]print(x)y=[x**2 for x in range(10)]print(y)i ...

  7. Linux单机环境下HDFS伪分布式集群安装操作步骤v1.0

    公司平台的分布式文件系统基于Hadoop HDFS技术构建,为开发人员学习及后续项目中Hadoop HDFS相关操作提供技术参考特编写此文档.本文档描述了Linux单机环境下Hadoop HDFS伪分 ...

  8. Java中的流(1)流简介

    简介 1.在java中stream代表一种数据流(源),java.io的底层数据元.(比作成水管)2.InputStream 比作进水管,水从里面流向你,你要接收,read3.OutputStream ...

  9. AJPFX理解反射及反射的应用

    怎么理解反射,反射的应用        反射就是把Java类中的各种成分映射成相应的Java类.        一般情况下我们要解决某个问题,先找到相关的类,创建该类的对象,然后通过该对象调用对应的方 ...

  10. 关于Android软键盘把布局顶上去的问题(一)

    最近接触到了一个登陆页面,布局最上面显示的是一个波纹的view,中间显示账号和密码的EditText,紧接着还有一个Button: 希望:点击EditText时,软键盘不能把波纹的view顶出去,也不 ...