NOIWC 2020
JasonL
·
2021-01-31 22:42:31
·
个人记录
NOIWC
Day1
1st 数据结构与实际应用
01 测测你的路由器
TL:30.00s ML:1.00G
题意
在线 对查询地址与路由表中地址进行最长前缀匹配 ,返回对应地址的下一跳(nexthop)。其中地址表示为01串。
算法分析
01 朴素算法
直接存下每个地址对应的下一跳信息。
记录时空复杂度极大。查询O(1) .
02 基于Trie树的算法
在Trie树每个节点保存对应的下一跳,用Trie树解决最长前缀匹配。
时间开销大大减小(32次内存访问),空间开销也较小(不超过32N个节点)。
实际性能266ms,52M。
官方记录
03 路径压缩Trie
将Trie的中间节点(只有一个子节点的节点)删去。在每一个Trie的节点记录下该节点的前缀和长度。
时间开销(最多32次内存访问查询),空间开销也减小(不超过2N-1个节点)。
然而问题在于如何实现子节点的跳跃。个人认为是将压缩路径整合的01trie记录起来进行匹配。
实际性能381ms,55M。
官方记录
04 基于Hash和二分查找的算法
在Hash表中保存所有节点,查询时二分匹配长度(节点深度)。
时间开销:6次Hash表访问/查询
空间开销:不超过32N个节点。
用<map>即可实现。
实际性能:1603ms,86M。
官方记录
05 基于二分查找的算法
考虑在网络地址范围进行二分。
首先“补全”所有节点,使每个节点要么是叶节点,要么有两个子节点。
然后取出叶节点表示的区间,合并相同下一跳的区间。
查询时在“区间列表”中二分即可。
时间开销:logN次内存访问/查询。
空间开销:不超过2N-1个区间。
实际性能:245ms,17M。
官方记录
06 基于位图的算法
对05的优化(二分查找logN)。
快速查询可以使用位图(Bitmap)。
每个地址对应一个位,区间左端点对应位为1,其余位为0。
例如100010000000表示0和4两个地址是存在的。
目的地址所在区间编号=sum[0...addr].
位图上快速计算前缀和:
每64位一组,预处理以组为单位的前缀和,用32位整数保存。查询时读取一次前缀和,再统计不满一组的64位中“1”的个数。
可用位运算快速进行64位统计。
空间开销:512M(位图)+256M(前缀和)。
时间开销:前缀和访问、位图访问、下一跳数组访问各一次。
实际性能:322ms,501M。
07 Lulea算法
简化版:
三层Trie树:
第一层:前16个bit
第二层:中间8个bit
第三层:最后8个bit
预处理:每一层使用06算法。
前两层结构指向下一层,第三层结构指向下一跳。
见Small Forwarding Tables for Fast Routing Lookups[Mikael Degermark,Andrej Brodnik,Svante Carlsson,and Stephen Pink].
查询11.08ns/次查询(60.68 Gbps),41M。不超过3次06查询->9次内存访问。
时间效率增加:
空间开销小
内存访问次数少:缓存命中率高
面向数据:16-24bit的最长前缀占90%以上
08 Poptrie算法(6+6+6+6+6+2)
每层高度为6的Trie树,使用06结构。
优于Lulea算法。
总结与讨论
OI中的算法(01-06):
选择不同基本算法
追求更好的时空复杂度
减少常数(可能是操作次数)
实际应用中的算法(07&08):
面向指令集和缓存进行优化
从数据中挖掘特性来设计更优结构
这些算法均基于Trie结构。
02 路由表压缩
TL:10.00s ML:1G
题意
给定路由表,输出一个与之等价 且最优 压缩的路由表。
等价:每个IPv4地址在两张表中对应的下一跳分别相同。
最优:不存在表项更少的等价压缩路由表。
算法分析
01 树形DP
02 ORTC(Optimal Routing Table Constructor)
标记下传
实际应用中的需求
路由表每秒可能有上万次的更新。
1 保持最优压缩率:更新最劣O(n)
2 不进行压缩/调整(压缩率不可控)
3 局部次优压缩(时间、压缩率如何控制?)
考虑动态DP?(临时更新)
如何权衡时空复杂度?亦或是避免重压缩?
考虑替罪羊树?(类比推理)
如何快速判定压缩算法正确?->快速找出两个路由表中不等价的区间
03 路由表等价问题
题意
给定路由表A和B,判断它们是否等价
(每个IPv4地址在两张表中对应的下一跳分别相同)
如果不等价,找出下一跳不相同的区间。
n=8\times10^5
算法分析
两遍扫描
第一遍:将路由表转换成区间列表。
第二遍:检查两个区间列表是否相同。
EX03 增量更新
题意
03题面变为多次询问,带修改操作。Q=10^5
算法分析
数据结构维护
每个子树的路由信息是独立的(除去祖先下传的标记影响)
子树信息由根节点、左右子树组成(自下而上统计)
在Trie树上可以将标记下传影响到的、不受标记下传影响的信息分开统计。
用多项式Hash来表示字数范围内的下一跳信息(树Hash)
每次更新时间复杂度为O(Trie树深度)。
路由压缩算法的总结和讨论
静态路由压缩问题:存在最优算法(树形DP,ORTC)
路由表等价性判断问题:存在简单算法(两遍扫描,Hash)
->优化目标单一,容易彻底解决
实际应用:动态路由压缩算法(见“实际应用中的需求”)
不存在最优解,存在多个次优解;指标难以衡量
从竞赛中的“复杂度”“最优解”到实际应用中的“软硬件与数据优化”“多种评价标准”
2nd 数据驱动的算法
摘要
高维向量空间的常用算法
大数据应用的常用算法
优化算法与机器学习
高性能计算相关知识
Data Science vs. Computer Science
《Foundations of Data Science》(John HopCroft)
从离散数据(序列、树、图)到连续数据(向量、函数)、高维空间
从精确的时间复杂度到基于实际数据的复杂度
从组合优化算法到概率、线性代数、连续优化
US Berkeley CS 270 Graduate level algorithms and data structures
高维向量
高维向量是数据处理里面最常见的基本数据结构,广泛应用于机器学习、搜索引擎、图像处理等行业。可以代表图片、文档、音频、用户信息,往往具有低维子结构。
二维向量最近邻(求向量最小夹角)
三维向量最近邻-》随机选择多个平面,将向量投影到二维。
线段树与KD-Tree
两个算法可以分别解决一维和二维的Locality-Sensitive Hashing(局部敏感度哈希)问题。
OI中多见线段树,而KD-Tree则少见。
[APIO2018]Circle selection
可以用KD-Tree。暴力O(n^2) ,需要剪枝。
据说可以用可持久化线段树,复杂度O(n\log^2n) 。但是运行速度慢。
大数据算法
线性时间复杂度、内存受限
自然数据往往服从Power Law
并行计算、分布式计算
搜索引擎、推荐系统
集合大小估计
题意
你需要从数据流中不断读取数据d_i ,但只有常量级别的内存用以存取中间结果,询问在任意时刻,估算当前已读取的数据里,不同的元素的个数。也就是集合\{d_i\} 的元素个数。
Minhash算法
假设数据在某个Hash空间里均匀分布。那么集合越大,hash值的平均间距越小,这导致所有hash值的最小值也越小。
因而可以用hash值的最小值来预估数据间隔,进而预估集合大小。
交集、并集只需要三次该算法(A,B,AB)即可。(交集+并集=|A|+|B|)
搜索引擎
算法实现
OI算法
KMP的复杂度与数据无关,恒定为O(n+m)。
后缀自动机也同样可以考虑。
倒排索引
以单词、词组为粒度,构建单词->文档列表的索引链。
将查询拆分成w_1,w_2,w_3,\dots ,将单词对应的文档列表求交集。
每个“单词”可以看做对候选文本集合的一个划分或一个hash编码(可参考《数学之美》)
多用于图片检索、基于用户画像的商品检索、新闻检索
利用机器学习算法对候选集进行个性化排序。
对比:OI算法与实际应用
为什么倒排索引算法不会出现在OI里?
自然数据具有规律性(Power Law),词组个数有限
搜索数据并非100%命中。
为什么KMP在实际应用中没有被选择?
面对少量的随机数据性能比高,但面对海量数据难以解决。
*数据流性质:无法保存
不需要精确匹配
随机化思想
《浅谈随机化思想在几何问题中的应用》《骗分导论》“模拟退火”
旅行商问题
题意
给定N个点的无向图,找到里面的一条全遍历路径,使得经过的边权值最小。N<30。
随机化算法
N皇后问题
题意
求N皇后的可行解。N\le 10^6
随机化算法
random_shuffle
计算该排列下各条对角线“皇后冲突数”的平方和(统计i+j和i-j的重叠数量)
(平方和相比于和更容易区分方案的优劣,从而让程序进行期望更多可行的调整操作)
随机选择两个皇后位置交换,如果交换后冲突数平方减小,则交换。
until 找不到这样的两个皇后
发现估价函数在随机化算法中依然占有重要地位。
结构型可行解转化为优化问题(适用随机化算法)。可以通过Loss Function度量当前解与目标解的距离。
随机调整与梯度下降
实际情况:
Gradient-descent works surprisingly well in deep learning
模拟退火、加噪音都可以帮助算法逃出次优解。
随机种子的选择:
难以生成真随机数;需要根据实际情况进行调整。
与之相比,通过调整步长、检验方法更容易增大命中率。
数据拟合问题
最小二乘法
给定二维平面的N个点,寻找直线y=ax+b 使得\sum(y_i-\top y_i)^2 最小。其中\top y_i=ax_i+b .
解法:展开函数式,优化目标是关于a,b 的二次凸函数,求得导数为0的点。
一些重要的概念:
已有数据(数据库)、待优化参数(如a,b ),优化目标
核心假设:
优化得到的参数对新的(x,y)同样适用。->机器学习的泛化性
##### 题外话
###### *重要大学课程
线性代数、信号处理/傅里叶变换
(周期函数的解析式可表示成多个正弦/余弦函数带权和)
通过选定多个基底函数,尽可能拟合数据。(根据要求的精确度)
【基底:将对象表示为向量的工具】
###### *自然信号与基底函数
音频信号、自然语言与单词/词组($w$),图片信号(基本图形处理)
###### *深度学习与基底函数
- 适用于图形处理、人工神经网络
- 多层次优化&线性优化
- 仍然是对数据的拟合问题
#### 数据优化搜索
上一代搜索算法:A*,AlphaBeta剪枝,双向搜索
现在:基于强化学习(Reinforcement learning)的搜索
##### 估价函数
适用于搜索剪枝、状态的优先级选择。
类比:网络流SAP算法的“当前弧”优化
###### 棋盘游戏的估价
人工规则:
五子棋数连续串的长度分布
象棋数不同类型的兵种个数
围棋?利用历史棋谱数据
人的学习:分析棋谱、自我模拟
机器学习:棋谱相似性、局部策略的可能性
##### Monte Carlo Tree Search
不等式估计上下界:准确但缺少精度。
MCTS:尝试随机走几条路径:局部估计整体。
搜到一定层次后,模拟博弈双方基于策略函数f(x)随机进行决策,重复多次用统计结果预估初始状态对谁更有利。
#### 高性能计算
##### 算法复杂度
OI分析:认定输入与输出时间相同;硬件的处理时间等时。
实际情况:计算机不同数据访问时间大不相同。
《论程序底层优化的一些方法与技巧》、压位法、位运算、常数优化
时间复杂度与硬件结构密切相关(真正耗时的计算指令数量)
###### 快速矩阵乘法
分块算法:小块计算矩阵乘法,通过读取高速缓存提高效率。
##### 并行计算
通信问题?->抛弃串行化编程思维
计算前缀和->树形归并
###### 出题考察并行计算
交互式题目;调用接口次数作为评价标准
### 3rd 集训队选手交流
#### 离散傅里叶变换(DFT)
本质:将$w$代入多项式中得到点值序列。
一般模数离散傅里叶变换(MTT)详见2016论文(毛啸)。
#### 二分图最大匹配
##### 费用流
###### SPFA算法
经典的单路增广。$O(n^4)$。
###### Dijkstra
需要将带负权图转化为非负权图。$O(n^3)$。
常数较大,小规模数据跑不过SPFA。大规模数据也无法承受。
##### KM算法
##### 线性规划
详见2016年论文集。
#### 最小内向森林问题
##### 题意
给定带权有向图,对于特定k,求出恰包含k条边的最小内向森林。
##### 最小树形图算法——“朱刘算法”
引理
将一个节点的所有出边的权值同时加减,不影响最优解树的形态。
若图上所有边权非负,那么边权全为0的环可以视为一个节点。
1)将所有边权变成非负
2)任选待确定出边u
3)u最小出边边权变为0
## Day 2
### 1st OpenCup
#### 01 Shoes
##### 题意
见IOI2019。
##### 分析
对于绝对值相同的数,必然是第i个负数与第i个正数互相匹配。
于是转化为:有n对数(a_i,b_i),需要确定它们的相对顺序,使得它们按顺序拼接起来后逆序对数最小。
同样对绝对值不同的数进行手操。发现优先配对即可。
#### 02 Split
##### 题意
见IOI2019.
##### 分析
###### 树的部分分
不妨设$a\le b \le c$,只需要让大小为$a$和$b$的集合连通即可。
注意到两个集合之间一定存在一条边将它们分开。枚举边,找到一条边使得一侧点数为$\ge a$,一侧点数$\ge b$。
定根后,问题转化为求是否存在一棵子树。其子树大小在$[a,n-b]$或$[b,n-a]$内。一遍DFS即可。
###### 一般情况
由于连通性只需要树就可以保持,所以如果有解,那么存在一棵生成树也有解。
设子树大小区间为[l,r].
任意找一棵dfs树,如果其存在于一个子树大小在区间[l,r]内,那么得解;否则由于2r>n,一定存在唯一的一个点v,其子树大小大于r,且每个儿子子树大小都小于l。
由于DFS树只有返祖边,非树边中只有v子树内连向v子树外的边是有用的。假设是从子树内的x连向子树外的y,x 到v路径上的最后一个点是z,那么我们可以删除(v,z)这条边,加上(x,y)这条边,相当于删除z这个子树。
假设当前子树大小为p>r,删去一个大小为q<l的子树,其大小$p-q>r-l\ge l$,即删去一个子树后不会低于下界。所以能删多少就删多少最优。枚举所有非树边并删除对应子树知道v的子树大小在[l,r]内时停止。如果到最后v子树大小仍然大于r,则无解。否则得到一组解。
精细实现O(n+m).
#### 03 Counting Cactus
Source:XX OpenCup Gp of Kazan,Problem C
##### 题意
给定一张n个点的无向图。求图的生成仙人掌个数。
n\le 13
##### 分析
使用圆方树。对最终仙人掌的圆方树进行树形DP。
状态:
- f(v,S)表示以v为根,子树中点集为S的方案数。
- g(v,S)表示以v为根,子树中点集为S,且v只跟一个点相连或只在一个环中的方案数。
- h(v,u,S)表示对一个环进行DP,当前环走到v,终点是u,子树中点集为S的方案数。
时间复杂度$O(3^nn^2)$.
#### 04 Determinant
Source: XX OpenCup GP of Kazan,Problem D
##### 题意
给定一张n个点m条边的无向图,满足对于其中任意一个大小为k+1的点集A,存在两个点a,b \in A和一条边 e,使得a到b的所有路径都经过e。求这个图的邻接矩阵的行列式。
$n\le 2.5\times 10^4,m\le 5\times 10^5,k\le 25$。
##### 分析
由行列式定义知当且仅当存在一种划分环的方案时才有值。
观察一:图的行列式等价于将它划分成若干个环,对于每个方案其权值为-1的偶环个数次方,对所有方案的权值求和。
观察二:每个边双大小不超过k。
将边双缩点检出对应树形结构。在结构上进行树形DP。一个子树有两种状态:根被子树内的环覆盖;根被它与父亲的边连成的环覆盖。
为区分两种状态可建立虚点。
#### 05 Fast Spanning Tree
Source:...,Problem F
##### 题意
有n个点的无向图,每个点有一个点权,图中初始没有任何边。给m个$(a_i,b_i,s_i)$,不断执行以下操作直到不能执行为止。
选取最小i,使$a_i$与$b_i$不连通且$a_i$所在连通块点权和加$b_i$所在连通块点权和$\ge s_i$,然后在$a_i$和$b_i$间连一条边。
复原连边过程。
$n,m\le 3\times 10^5,s_i\le 10^6
分析
注意到val_a\ge \frac{s}{2}||val_b\ge \frac{s}{2} 。
对每条边,当每次val_u\ge \frac{s}{2} 时,检验是否能加入这条边。不能,s 将当前点权和删去,新的s 至多变为原来的一半。
利用启发式合并可以做到O(n\log^2n\dots)
06 Honorable Mention
Source:...,Problem H
题意
给定长度为n的序列,q次询问某区间的k -最大子段和.
##### 分析
###### 费用流与模拟费用流
首先费用流尝试流k次即可得到$k$-最大子段和。
模拟费用流?UNKNOWN
###### 二分与整体二分
引理:考虑对于一段区间,记$f(k)$表示这个区间的$k$-最大子段和.则$f$是凸函数。
建出线段树,对于每个区间$[l,r]$预处理出$f(1),f(2),\dots,f(r-l+1).$在合并两个函数时,注意到函数是凸的,因此差分之后是单调的,可以贪心合并。
对于答案是凸函数,要求选恰k个的问题,有一个常见技巧:因为一定存在a使得函数$f(x)+ax$在$k$处取得极值,我们可以通过二分$a$找到恰好选$k$个的最优方案。这个问题中相当于每多选一个字段会额外获得$a$的收益。
在线段树上定位出的区间二分出对应$a$的最优的$k$,并用一个$DP$合并这些信息。
如果改为整体二分可降为$O((n+q)\log n \log V)$。
#### 07 Bulbasaur
Source:XX OpenCup GP of Warsaw,Problem B
##### 题意
有$nm$个点的有向分层图,共$n$层,每层$m个点$,每条边一定从第$i$层连向第$i+1$层。
定义$f(i,j)$表示选择若干条路径,每条路径从第$i$层出发,在第$j$层结束,且每条路径在顶点和边上都不交的情况下最多选择的路径数。
求$\sum\limits_{i=1}^n\sum\limits_{j=i+1}^if(i,j)$.
$n\le 4\times 10^4,m\le 9$.
##### 分析
###### 网络流
直接跑最大流即可。
###### DP
最大流等于最小割,问题可以转化为删除尽量少的点使得两边不联通。
考虑第$l$层到第$r$层,记$f(S)$表示使得仅有第$r$层的点集$S$与第$l$层的点连通,最少需要删掉的点数。不难发现$f(S)$关于$l$是单调的,且$f(S)$的值只有$m$种。
从小到大枚举$r$,维护不同$DP$值的分界点转移即可。时间复杂度$O(nm^22^m)$.
#### 08 Eevee
Source:...,Problem E
##### 题意
定义对k个长度为n的序列的归并为,维护一个空序列A,执行下列操作kn次:选择一个非空序列,将其第一个数取出,放入A的末尾。
两个归并不同,当且仅当存在某次操作选取的序列标号不同。
一个归并被称为是合法的,当且仅当最终序列A中不存在长度为k的子串,使得这个字串中的数为同一个数。
给定$m$个长度为n的随机生成的排列,定义$f(l,r)$表示只考虑$[l,r]$中的排列不同的合法归并方案数。求$\sum \sum f(i,j)$的值。
##### 分析
考虑容斥。记$f(x)$表示归并到了某个时刻第一次出现连续的$k$个$x$的方案数。转移则是用总方案数减去在之间出现连续$k$个$y$的方案数。
枚举区间左端点,每次新增一个排列,可以$O(1)$计算出新的转移系数。这样的时间复杂度为$O(n^2m^2)$.
注意到数据随机,考虑一对$(x,y)$,其转移系数非$0$的概率为$\frac{1}{2^n}$.
于是降到$O(nm(n+m))$。
#### 09 Infernape
Source:...,Problem I
##### 题意
给一个$n$个点的树,$q$次询问,每次给$k_i$个树上邻域(离$v_i$距离不超过$r_i$的点集),求至少属于$k_i-1$个点集的顶点个数。
$n\le10^5,\sum k_i\le 3\times 10^5$.
##### 分析
问题主要操作:给两个树上邻域求交,查询树上邻域的交集大小。
定义广义树上邻域为树上邻域或者距离一条边距离不超过一定距离的点集。有结论:广义树上邻域的交仍然是广义树上邻域。
为方便实现,将边拆点,则只需考虑树上邻域。
可以用一些讨论和树上倍增快速合并两个树上邻域,并通过预处理点分数快速求出一个树上邻域的点数。
每个询问枚举去掉一个树上邻域,将其他树上邻域的交求和,去掉重复部分即可。
#### 10 Container
Source:XX OpenCup GP of Korea,Problem D
##### 题意
给一个长度为$n$的只含有1和2的字符串。
你可执行操作:
选择一个长度不超过$3$的区间将它反转,代价为区间内所有数的和加上一个给定的常数$c$.
求变成目标串的最小代价。
$n\le 500$.
##### 分析
首先1和2可以看作在二维平面里向上走和向右走。
原串和目标串就变成了在二维平面上围成的割补问题。
能进行的操作只有$12\leftrightarrow21,112\leftrightarrow211,122\leftrightarrow221$.
故一次操作对应一个$1\times1,1\times2,2\times1$的矩形修改。
先将初始解设为全部用$1\times1$覆盖,接下来可以合并两个$1\times 1$矩形得到一定收益。注意到是一个二分图,求出最小费用最大流即可。精细实现$O(n^3\log n)$.
DP求解时间复杂度$O(n^2)$.
#### 11 Angle Beats
Source:XIX OpenCup GP of Kazan,Problem A
##### 题意
给一个$n\times m$的棋盘,每个位置$ABC$三种状态,你需要在上面放上尽量多的Domino(每个覆盖三个格子)。要求:
如果放$L$形,其中新必须为$A \or B$,两边必须为$C$.
如果放$I$形,其中心必须为$A$,两边必须为$C$.
求最多能放的多米诺个数。
$n,m\le 100$.
##### 分析
###### 最大流
似乎可以处理。真的吗?
感觉直接建图难以处理……
###### 二分图最大匹配
如果没有状态B,问题等价于:给定一张二分图,左边每个点如果在匹配中,要匹配右边的两个点,求最大匹配。
将左边每个点拆成两个,它们之间连一条边。只有当两个点同时向外界连边时才会有收益。
对于状态B,只需要将它拆成的两个点,一个连横向边一个连纵向边即可。最后使用带花树求解最大匹配,时间复杂度$O(n^2m^2)$.
#### 12 Dates
Source:...,Problem D
##### 题意
有$m$个盒子,第i个盒子可以放$a_i$个球。有$n$个球,第$i$个球如果放在$[l_i,r_i]$之间的某个盒子里可获得$p_i$的收益。求最大收益。
保证$l_i\le l_i+1,r_i\le r_i+1$.
$n,m\le 3\times 10^5$.
##### 分析
###### 费用流
可以考虑通过线段树连边优化。
但还是过不去。
###### 贪心
经典拟阵模型。
需要快速判断加入某个球之后是否还能将当前所有球放入盒子里。这是二分图上的网络流问题,考虑使用$Hall$定理加速判断。
考虑$Hall$定理在区间上的版本。对任意$x\le y$我们需要满足$\sum^{r_y}_{i=l_x}a_i\ge w_y-w_x+1$,其中$w_x$是当前所有球中$x$的排名。
用前缀和将式子分成只与$x$和$y$有关的两部分,分别维护它们的极值即可。
时间复杂度$O(m+n\log n)$.
#### 13 Graph Counting
Source:...,Problem G
##### 题意
求$2n$个点无标号图的个数,满足图中没有完美匹配,但加了一条边就有完美匹配。
$n\le 5\times 10^5$.
##### 分析
根据$Tutte-Berge$公式,$G=(V,E)$最大匹配为
$\frac{1}{2}\min\limits_{U\in V}(|U|-odd(G-U)+|V|)
其中odd(H) 表示H 中大小为奇数的连通块个数。
由于原图中最大匹配为n-1 ,有\min\limits_{U\in V}(|U|-odd(G-U))=-2 .考虑对于这样的一个点集U ,如果U 中某个节点度数不为|V|-1 ,则添加一条连接U 到不满的边,值仍然不变,不合法。同理可得其他点的情况。
设有k 个度数为|V|-1 的点,删去它们后应有k+2 个奇数大小的团,显然这样的图也满足加一条边后就有完美匹配的条件。对于每个团,令其点数加上1变成偶数,同时不管那些度数为|V|-1 的点(这样的点数由团的个数唯一确定),则现在总的点数为2n+2 。
变成1的拆分问题。时间复杂度O(n\log n) .
14 Hall's Theorem
Source:...,Problem H
题意
构造一个两边各n 个点的二分图,记N(A) 表示与A 中的点有直接连边的点集。需要使|N(A)|<|A| 的点数恰好为k .
##### 分析
将问题转化成构造恰好$k$个$A$使得$|N(A)|\ge |A|$.
考虑这样一种图:左边第$i$个点连接右边的前$a_i$个点,且$a_i$递增,我们有
$k=\sum\limits_{i=1}^n\sum\limits_{j=1}^{a_i}(i-1,j-1)
这是一个类似组合数进制拆分的东西,贪心构造即可。时间复杂度O(n^2) .
15 Jealous Split
Source:...,Problem J
题意
给一个长度为n 的序列,将其划分为k 部分,记s_i 表示第i 部分的和,m_i 表示第i 部分的最大值。需要构造一个划分使得
$n\le 10^5$.
##### 分析
考虑任意一种不合法划分,我们移动划分点使得原来相邻的两个集合变得合法。
#### 16 Busy Board
Source:XIX OpenCup GP North America,Problem B
##### 题意
给一个$n\times m$的黑白网格,你可以不断执行以下操作:
选择一个黑白格子,将它变白,并把同行同列的其他格子变成黑色。
求一个状态能否经过若干次操作到达另一个状态。
$n,m\le 10^3$.
##### 分析
首先特判始末状态相同情况。
倒过来操作,每次操作是将一个白色格子变黑,要求它同行同列全是黑的,然后把它同行同列的格子改成任意颜色。
执行一个类似BFS的过程,可以进行操作的中心格子一定形如$\{(r,c)|r\in R,c\in C\}$的形式,其中$R$和$C$分别是行和列的集合。
合法状态需要满足初始状态需要能进行操作,且对于其他不在$R$和$C$中的格子,它们的颜色保持不变。
$O(nm)$.
#### 17 Hat With An Integer
Source:XIX OpenCup GP of Bytedance,Problem H
##### 题意
有$n$个人,第$i$个人手上都有一个数$a_i$,每个人能看到别人的数,但不能看到自己的数。每个人还知道在以下$2(n-1)$个条件中,至少有一个是成立的:
$a_{i+1}<a_i+b_i
a_{i+1}>a_i+c_i
每个人都是绝顶聪明的。如果有一天某个人知道自己的数不是x ,游戏结束。求结束天数。
##### 分析
原问题等价于修改尽量少的$a_i$使得这些条件都不成立。
前缀和,相当于我们要保留尽可能多的$a_i$,使得对于任意一对被保留的相邻的$(i,j)$,我们有:
$???
问题转化为三维最长上升子序列问题,用二维数据结构或分治解决。
如果a_i-B_i 和a_i-C_i 都是有序的话,i 也一定是有序的。于是可以优化。
2nd 组合题选讲
01 皮配
题意
详见十二省联考2019.
分析
如果先选择导师,难以解决条件限制。
注意到阵营或派系与选择导师无直接关系。我们可以先将学生分为YR派系,再将城市分为红蓝阵营。这样就可以完成限制问题。
【独立性】
直和
I_P=\{\cup A_i|A_i\in I_P\cap 2^{S_i}\}
对I_P ,若每个集与每个分治部分的交满足P ,从每个分治部分中任取一个满足P 的集,它们的并依然满足P ,那么I_P 是\{I_p\cap2^{S_i}\} ,称A_i 是A=(\cup A_i) 在S_i 上的投影。
例如图的每个连通块、线性基每个元素张成的空间。
直和问题只需要分别讨论每个部分即可。(优化即部分优化)
02 [BJ United Round #3]押韵
题意
一个长nd 的序列,每个位置要染成k 种颜色之一,要求每种颜色出现次数都是d 的倍数。
求方案数\mod 1049874433 .
n\le 10^9,k\le 2000,d=1,2,3,4,6
分析
能不能将nd 分为n 组,然后组合数分配颜色?
(然而搞不定)
03 [清华集训2017]无限之环
题面
接水管游戏:一个n\times n 的网格状棋盘,每格是15种水管之一。
你可以逆时针或顺时针旋转任意非直线型水管任意次。
给定初始局面,要求你旋转水管使得最终不存在断头,最小化旋转总度数。
##### 分析
## Day 3
### 1st
#### 01
#### 02
#### 03 Party
给定一个大小为$3n$的无向图,保证其中有一个大小为$2n$的团,请你找出一个大小为$n$的团。
##### 分析
我们找任意一个大小为$2n$的团,称其中的点为团内点,剩余的点为团外点。
找极大团,若包含团外点,无法保证最终团大小。
由于团内点之间两两都有边,所以我们找出任意一对$(x,y)$,如果$x,y$连接的点不同;
#### 04 Cave
##### 题意
求一棵树点分树的最大深度的最小值。
##### 分析
我们可以这样定义$f_x$为树的深度:
$f_x\ge 0
对于任意两个不同节点x,y ,若f_x=f_y ,则存在一个u 满足u 在x 到y 的路径且f_u>f_x .
题目转化为求f 的最大值的最小值。
以任意节点为根后,考虑子树的f 对其他节点的影响。
只需要关心子树内f 值到子树根路径上的最大值的节点。这些节点的f 值就是子树的根x 的父亲无法设置的f 值的集合,记做S_x .
进一步可以用二进制数表示S_x .
按照dfs 序,贪心地设置f_u 使得val_u 最小。
将最小化最大值转化为最小化根的二进制数val .
考虑合并子树的过程,设cnt_x 为x 在多少个儿子的S 集合中出现过。
设根的f 值为v .
若cnt_x\ge 1 则v \not = x ;若cnt_x\ge 2 则v>x .
根的val为所有儿子val 的二进制OR ,将第v 位设为1,第0 到v-1 位设为0 .可以推得最小化子树的根的val 。
注意到答案不会超过\log n .因而int 即可、
时间复杂度O(n \log n)-O(n) .
05 Fishes
06 Fibonacci Sums
题意
见链接。
分析
首先考虑两个序列合并后每个f_i 对应的c_i\le 2 .
首先消去2 ,再考虑相邻的1 .
消去2 时先找到最高位的2 。
然后消除相邻的1。如果产生新的相邻1,继续操作。
07 Axes of symmetry
题意
给出n 多边形,不自交。找到图形所有对称轴。
分析
对于一个图形,至多2n 个对称轴。要么是经过点的角平分线,要么是一条边的垂直平分线。
枚举可能的对称轴,暴力判断是否对称。
如何快速判断对称?对应边长、对应角度相等。
给出边长序列与角度序列,转化为字符串问题。哈希O(1) 判断即可。
注意角度的方向。
08 Ploughing
分析
判断能否删光?可以贪心。
删除最大的列/行?不满足最小操作次数。
删除合法的最长的列/行?
我们假定最后删除的方向是横向/纵向。那么枚举[l,r] 区间最后删除,确定的部分就不能被另一方向删除。这时候再判断能否删光即可。
09 Circular Game
分析
将环分为若干块,其中每一块都由相同颜色的棋子组成。
由至少3个同色棋子构成的块:
若有空隙,则该颜色持有玩家不会输。
若无空隙,则该颜色持有玩家可能可以通过一步获得空隙。
这样的块可称为W .若一方有W ,一方没有,则有的那方必定获胜。
玩家的首要目标是让自己获得W ,让对手无法获得必杀块。若必杀块无缝隙,则堵住必杀块的棋子一定不能移动。
考虑只有1个棋子的块,一定形如WW B W B WW或WW B W BB。
对于两边同色,等效于必杀块。
对于两边不同色,等效于相邻两个的nim游戏。(WW-B,W-B,W-BB)
因而我们优先处理大小为1的块。
处理必杀块。如果能判断出结果则结束。如果不能,使用Nim游戏决出胜负。
10 Matching
题意
给定一个长度为n 的序列\{a_i\} ,一个长度为m 的序列\{b_i\} 。保证序列中没有相同元素。两个序列等价是指他们离散化后的结果相同(相对大小关系相同)。求\{a_i\} 中有多少个连续子序列与\{b_i\} 等价。
##### 分析
###### KMP
计算Fail数组。问题变为给定一个序列,以及两个区间$[l_1,r_1],[l_2,r_2]$,$[l_1,r_1-1]$与$[l_2,r_2-1]$等价,判断$[l_1,r_1]$与$[l_1,r_2]$是否等价。
数据结构$O(\log n)$计算$rank$,总复杂度$O(n\log n)$.
预处理$\{b_i\}$序列的每个数在前缀中$rank$相邻的两个位置。
总复杂度$O(n)$(不含排序)。
###### Hash
设离散化后数组$a_0-a_{l-1}$,哈希值为$(\sum\limits_{i=0}^{l-1} c^ia_i)\mod p$.
将$p$设定为质数,用数据结构更新哈希值。
$O(n\log n)$.
#### 11 Termites
##### 题意
给定非负整数序列$a$.$Alice/Bob$在玩游戏。$Alice$先手,轮流操作。每次可选择一个与$0$相邻的非$0$元素,并将其变为$0$.所有元素都为$0$时游戏结束。最终得分为选择过的元素的和。双方使用最优策略,最大化自己的得分。求游戏结果。
$n\le 10^6$.
##### 分析
引理
若全局最大值$M$可被取到,则取$M$最优。
定义
策略$p$是一个游戏局面到操作的映射。可以通俗理解为一个可以进行对战的确定性$AI$.
$val_G(p,q)$为先手使用策略$p$,后手使用策略$q$从游戏局面$G$开始对抗最终先手的得分与后手的得分之差。
游戏$G$的值为$val(G)=\max\limits_p\min\limits_qval_G(p,q)
先手策略p 最优当且仅当val(G)=\min\limits_qval_G(p,q)
后手策略q 最优当且仅当val(G)=\max\limits_p val_G(p,q) .
现证明可以构造一个第一步取最大值的最优策略。
接下来说明存在一个第一步取了最大值的策p_2 ,对于任意策略p_1 ,满足\min\limits_{q_1}val_G(p_1,q_1)\le \min\limits_{q_2}val_G(p_2,q_2)
对于任意策略q_2 ,满足\min\limits_{q_1}val_G(p_1,q_1)\le val_G(p_2,q_2)
存在策略q_1 满足val_G(p_1,q_1)\le val_G(p_2,q_2) .
对于任意策略p_1,q_2 ,存在策略q_1,p_2 ,满足第一步取了最大值,且val_G(p_1,q_1)\le val_G(p_2,q_2) .
可以理解为同时进行两个游戏G_1,G_2 ,对手操作G_1 的先手和G_2 的后手,你操作G_1 的后手和G_2 的先手。
第一步,q_1,p_2 取最大值M .接下来我们的策略是,模仿对手操作。
G_1:p_1:x\ q_1:M
G_2: p2:M \ q_2:y
任何时候G_1 和G_2 局面完全相同时,我们完全模仿对手操作。这样可以一直保持局面相同。
12 Stamps I
给定一个2n\times 2n 的网格图,每个格子初始染黑或染白。每次操作你可以选择一个大小为n\times n 的子矩阵,并将其染黑。求将整个网格图染黑的最少操作次数。
分析
答案不会超过4.
矩形的并的限定框一定包含白格子的限定框。矩形个数小于等于3时,一定有一个矩形在矩形的并的限定框的角上。让在角上的矩形恰好顶住白格子限定框的角上。
让在角上
13 N and K
考虑所有值在1到N 之间单调上升整数序列,序列要满足其中不存在两个不同的数有倍数关系。给定K,询问所有最长的满足条件的序列中第K大的值最小是多少。
猜想:最长合法序列长度为。
考虑将数分为组,其中每一组中任意两个数都由倍数关系。第i组包含所有形如(2i+1)\times 2^k的数。
考虑一个最长合法序列,设$a_i$表示形如$i\times 2^k$的数中选择的数的$k$是什么。需要满足对于所有大于1的奇数$k$,有$a_{ki}<a_i$.
$a_i>\log_3 \frac{n}{i}$.
#### 15 Link-cut twotree
给定两棵树,每棵树有$n$个节点,$m$个叶子,每条边上有一个权值,保证$1$号节点不是叶子。需要将这两棵树的叶子一一对应并将对应的叶子合并,接着再选择$m$条边删掉,得到的$2n-m$个节点的新图需要满足:
新图中恰好形成的两个联通块,且块都是树。
最小化删除边的代价。
找到最少代价的善变方案使得叶子被分成$m+1$个联通块。
类似最小生成树算法,我们按照边权从大到小,贪心能加就加,始终保持也值得联通块个数至少$m+1$个。
并查集额外维护叶子个数。$O(n\log n)$.
#### [16 ](https://atcoder.jp/contests/kupc2014/tasks/kupc2014_1)
#### 17 SOULBLOCK
???
#### 18 自行車走
##### 题意
一场自行车比赛有长为$L$的赛道,有$n$个互不相交的区间。你必须在区间上骑行。骑行时你可以从当前位置$x$跳到$x+w$。要求两个位置必须在区间上。
起点为第一段区间左端点,终点为第二段区间右端点。求问到达终点的最小跳跃次数,或不能到达终点。
##### 分析
判断能否到达?每段区间记录最左的可达点。
如何计算最小步数?每段区间记录每个步数的区间。(不同跳法最左落点不同,步数也不同)
### 2nd ICPC
#### 01 Vision
Source:IOI 2019
坐标变换:曼哈顿距离$(x,y)\rightarrow(x+y,x-y)\over$切比雪夫距离
#### 02 Walk
Source:IOI 2019
中文译名:天桥
##### 题意
见洛谷。
##### 分析
从右往左(或者从下往上)扫描线建图。这里推荐从下往上。
首先,如果到达了一个建筑物的顶端,就把它从扫描线里删掉。
#### 03 Mona Lisa
Source:SWERC 2018
##### 题意
#### 04 Cactus Revisited
##### 分析
对于二分图可以取2。
否则考虑一个大小$2p+1$的奇环。答案至少为最小奇环的$\frac{2p+1}{p}=2+\frac{1}{p}$.
#### 0X Teams
考虑对于每个前缀求答案。
#### Guess the Answer
##### 题意
有$n$个判断题,每段题答案是0/1.你可以询问300次,给出你的填题方案,返回答对个数。求出题目的正确答案。
##### 分析
首先全局选1,得到全局0/1个数。
## Day 4
### 1st 概率论
$Union\ bound:Pr[\cup A_i]\le \sum Pr[A_i]
Pr[A]\le\frac{E[A]}{\alpha}
f(ave(x_i))\ge ave(f(x_i))
01 Min-cut
给出一个无向图,求最小割。
Karger's Min-cut Algorithm
等概率选择图中两个点,删除它们之间的边,并缩为一个点。一直到只剩下两个点,统计两点之间的边。
有\frac{1}{C(n,2)} 概率正确。因而跑n^2 有很大概率正确。
用最小割树也可。
02 最小圆覆盖
有n 个点,求最小圆覆盖所有点。
Random-shuffle
三点确定一个圆。设O_i 为覆盖前i 个点的最小圆。
如果点i 在O_{i-1} 里面,那么O_i=O_{i-1} .
否则点i 必定在O_i 边界上,在1\dots i-1 中枚举一个点j ,如果点j 不在圆中,那么它一定作为圆的另一个端点。
#### Randomized Search Trees
Treap:随机优先级,期望深度$\log n$.
#### 03 世界是个动物园
有一个竞赛图,对于节点$i$有$k_i$不相交的区间$[l_{i,1},r_{i,1}],\dots,[l_{i,k},r_{i,k}]
对于区间中的点j ,竞赛图中存在边(i,j)
不再区间中的点i ,竞赛图中存在边(j,i) .
求强连通分量。
竞赛图的性质:强连通分量形成一条链的结构。
加入节点i 时,假设有k 个强连通分量。\forall (i,j)\in E 找到j 所在强连通分量编号最小的,记为L .\forall (j,i)\in E ,找到j 所在强连通分量编号最大的,记为R .
如果L\le R ,那么i 以及L\dots R 会合并为一个新的强连通分量。
如果L>R ,那么L=R+1 ,则i 插入到L,R 之间形成一个新的强连通分量。
加入新节点过程中,对于所有节点维护一个权值p ,使得如果节点x,y 分别属于强连通分量u,v(u<v) ,那么p[x]<p[y] .
查询L,R 变为查询区间最小值和最大值。
重量平衡树
给每个节点权值p ,类似于一般的Treap中每个节点的键值,可以用于比较两个节点的排名。
在Treap中给每个节点权值区间[l,r]。
插入时候随机优先级,按照优先级旋转完后期望O(\log n) 时间重构权值区间。
注意到线段树中维护的区间中最大最小值,但在加入节点i 时,p[1,\dots,i-1] 相对大小不会改变,所以线段树修改的时候只需要修改包含节点i 的区间。
O(n \log n)
04 Max-cut
给出一个无向图,求最大割。
随机给节点分配\{0,1\} ,划分为不同区间。得到割的期望大小为\frac{m}{2} ,概率为\frac{1}{m+1} 。
prob.
\frac{m}{2}=E[X]=(1-p)E[X|x<\frac{m}{2}]+pE[X|x\ge \frac{m}{2}]\le (1-p)\frac{m-1}{2}+pm
p\ge \frac{1}{m+1}
所以只需要运行程序O(m) 次即可找到一个大小至少为\frac{m}{2} 的割。
Eg.所有图都存在一个大小至少为\frac{m}{2} 的割。
Extra
得到解与最优解比值大于\frac{1}{2} (近似比大于\frac{1}{2} )。
Max-cut是NP-hard问题。
05 Max-sat
有n 个布尔变量以及m 个式子。
每个式子为一些变量或一些变量的否进行或运算的结果,如x_1 or\ \lnot x_2 。
令尽可能多的式子值为1 .
首先问题可以放宽为可以在多项式时间内解决的线性规划问题。得到解\hat y,\hat z ,表示布尔变量的解和运算式取值的一个近似解,适合处理式子较长的情况。
对于每个变量x_i 令其有\hat y 的概率为真,1-\hat y 的概率为假。可以在其上得到一个适合处理式子长度较短的算法。
两者结合可以得到一个近似比\frac{3}{4} 的算法。
近似计算
标准问题
算法FPRAS,Monto-Carlo Simulation。
蒙特卡洛模拟
通过随机采样来得到估计解。
采样:随机给出输入,通过模拟得到输出。
设|U| 为全局状态数。|G| 表示采样得到的样本数。则\frac{|U|}{|G|} 不能过大。否则难以得到精度范围内的估计解。
于是需要均匀抽样。我们得到当前操作转移后的所有状态的方案数|A| ,以及当前状态的全局方案数|S| ,那么选择该操作的概率就定为\frac{|A|}{|S|} 。
对样本处理:由样本数据得到全局估计解。
Markov Chain
部分情况难以抽样。于是需要马尔科夫假设和马尔科夫链。
马尔科夫链与马尔科夫过程:
马尔科夫假设:假定当前变量的取值只与前一个变量的取值相关。即
P[x_i=X]=\frac{P[x_i=X|x_{i-1}=Y]}{P[x_{i-1}=Y]}
状态空间:所有可能取值所组成的空间,记为\pi\{x_1,x_2,\dots,x_n\}
平稳分布(Stationary distribution):\pi=\pi P 其中\sum_i\pi_i=1
两个随机变量之间的距离d_{TV}(X,Y)=\sup\limits_A(Pr[X\in A]-Pr[Y\in A])
对于有限马尔科夫链,定义两个分布之间的距离为d_{TV}(x,y)=\max\limits_A\sum\limits_{i\in A}(x_i-y_i)=\max\limits_A|\sum\limits_{i\in A}(x_i-y_i)|
Mixing\ time
在一些拥有较好的性质的有限马尔科夫链上,对于初始分布x ,最终会收敛到某个平稳分布\pi 上。
Coupling\ Lemma
对于任意两个随机变量X,Y ,有d_{TV}(X,Y)\le Pr[X\not=Y] .
周期(period )
对于一个马尔科夫链,一个状态i 的周期定义为m=\gcd(\{t>0|p_{ii}^t\not = 0\}) .若m=1 称状态i 为非周期性的。
一个马尔科夫链是非周期性的,当且仅当所有状态都是非周期性的.
如果一个马尔科夫链的状态是非周期性的,则存在t_0 使得t\ge t_0,p_{ii}^t\not =0 。
Lazy\ Markov\ Chain
p_{ij}'=\frac{1}{2}p_{ij},i\not=j
p_{ii}=\frac{1}{2}+\frac{1}{2}p_{ii}
2nd Search and Iteration Algorithm
Basic:DFS,BFS
A*(A-Star)
引入估价函数h(x) ,表示当前状态到终态的代价估计。
首先由h(x)\le g(x,ed) .(g(x,y) 表示从状态x 到状态y 的实际代价)
那么f(x)=g(st,x)+h(x) .f(x) 表示从初态经过状态x 到终态的估计总花费。
我们优先搜索f(x) 较小的,即可提高效率。
在图上还需要满足h(A)-h(C)\le g(A,C) .否则到达终点不会为最优解。
K短路——使用A*算法,取出第k次即为最终解。
IDA*
在A*基础上限制搜索深度,缩小空间消耗。从低到高增加限制深度,按照DFS序进行搜索。
Advertisal Algorithm
MinMax Search
最劣情况下的最优结果。
function Max-Value(state)
v<- -INF
for each successor of state do
v<- max(v,Min-Value(succ))
end for
return v
end function
function Min-Value(state)
v<-INF
for each successor of state do
v<- min(v,Max-Value(succ))
end for
return v
end function
必胜/必败态剪枝:
如果当前状态已经被确认为必胜/必败态,那么直接返回。
时间复杂度O(b^n) ,空间复杂度O(n) .
Alpha-Beta Pruning
即Alpha-Beta剪枝。
function Max-Value(state,alpha,beta)
v<- -INF
for each successor of state do
v<- max(v,Min-Value(succ))
if v >= beta then
return v
end if
alpha<- max(alpha,v)
end for
return v
end function
function Min-Value(state,alpha,beta)
v<- INF
for each successor of state do
v<- min(v,Max-Value(succ))
if v <= alpha then
return v
end if
beta<- min(beta,v)
end for
return v
end function
时间复杂度\sqrt{b^m}=b^\frac{m}{2} .
Meeting in the middle
折半搜索。重点在于如何合并。
Dancing Links
精确覆盖问题。
一个n\times m 的01 矩阵,要求选出一个行的子集,使得在这些选出的行中,每一列都恰有一个1 .
数据结构:双向十字链表。
固定一列,枚举选择使用哪一行。
把这一列所有行全部删除。
Climbing Mountains
爬山算法。其核心为
x_{n+1}=\max\limits_{x'\in Neighbor(x_n)}(f(x'))
Simulated annealing
模拟退火。
P(x_n\rightarrow x')=\begin{cases}0\\1\\2\end{cases}
Newton-Rahpson method
牛顿迭代法。
y=f'(x_n)(x-x_n)+f(x_n)
0=f'(x_n)(x_{n+1}-x_n)+f(x_n)
x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}
具有平方收敛性质。
Failure Analysis
错误初始点:
f(x)=1-x^2,x_0=0\rightarrow f(x)=0
Graph Iteration
Intro Prob.
赌徒问题:
有一个赌徒,初始有k 元,每次他有p 的概率赢一元钱,有1-p 的概率输一元钱,当他赢到m 元时就会离开,当手上没有钱时就会破产,问赌徒一直玩下去离开的概率。
迭代做法:
随机一个函数f_0:[m]\rightarrow [0,1]
\forall n\in N^+,f_n(x)=pf_n(x-1)+(1-p)f_n(x+1)
赌徒问题2:
有一个赌徒,初始有k 元,每次他可以押注t 元,有p 的概率再赢t 元钱,有1-p 的概率输掉这t 元钱,当他赢到\ge m 元时就会离开,当手上没有钱时就会破产,问赌徒一直玩下去离开的概率。
迭代做法:
随机一个函数f_0:[m]\rightarrow [0,1]
\forall n\in N^+,f_n(x)=\max \limits _{y\in[1,x]}pf_{n-1}(x-y)+(1-p)f_{n-1}(x+y)
MDP Problem
MDP问题:
状态集 S
可行动作A
转移系数 P(s,a,s')\rightarrow [0,1]
收益函数R(s)
衰减系数\gamma \in (0,1]
如果一个样本的状态序列为s_0,s_1,\dots s_n ,则总收益为\sum\limits_{i=0}^nR(s_i)\gamma^i
Topological Situation
DP即可。
General Situation
迭代做法:
随机一个初始分布V_0
\forall n\in N^+,V_n=R(s)+\max\limits_{a\in A}\gamma\sum\limits_{s'\in S}P(s,a,s')V_{n-1}(s'),\gamma < 1
V_{n+1}(s)-V_n(s)
=\gamma|\max\limits_{a\in A} \sum\limits_{s'\in s}P(s,a,s')V_n(s')-\max\limits_{a\in A} \sum\limits_{s'\in s}P(s,a,s')V_{n-1}(s')|
\le\gamma\max\limits_{a\in A}|\sum\limits_{s'\in s}P(s,a,s')V_n(s')-\sum\limits_{s'\in s}P(s,a,s')V_{n-1}(s')|
\le \gamma\max\limits_{s\in S}|V_n(s)-V_{n-1}(s)|
Memorize Search
Day 5
01 猜数游戏
算法1
暴力枚举S 的所有非空子集T ,然后枚举T 的所有子集检查其是否可以生成T .O(3^n) .
算法2
对于特殊性质B ,注意到数列u^i 在模p 意义下很快会归零,且相互关系构成若干条链。链与链之间互不相关。
建图
u,v$连边当且仅当$u^k 1 \mod p
02 选课
03 有根树