分治

普通分治

普通分治是指针对序列或平面问题的分治算法。

思想

普通分治的思想是指将一个序列问题或平面问题通过某种划分方式划分为若干个子问题,直到子问题规模足够小,可以直接回答,再通过合并得到原问题的解。

通常来说,我们划分的方式是某个与题目特征有关的值,例如最大值或最小值。而当不易使用特征值进行划分的时候,我们也可以直接使用中点来划分,以保证时间复杂度,再设法计算贡献。

重要例题和简要题解

\(1.\) 求序列所有子区间的最大值之和:利用最大值进行划分,计算每一个最大值的贡献即可。

\(2.\) 求序列所有子区间的最大值最小值乘积之和:利用中点划分,讨论最大最小值和中点的相对位置关系,预处理计算贡献即可。

\(3.\) 求序列所有子区间的\(gcd\)之和:发现\(gcd\)只有不超过\(log\)种取值,利用中点划分,分段计算贡献即可。

整体分治

整体分治指的是在带若干个询问,修改的动态问题中,对所有询问整体二分答案的分治算法。

思想

整体分治会对多个操作同时进行二分答案,再通过操作分类的方式,得到子问题,再向下递归求解,直到值域区间足够小,可以直接回答询问。

其精髓在于整体上的二分答案,以及询问的分类操作。当问题还带有修改操作时,我们还需对修改操作进行分类,这就需要根据操作的影响来分类,还需要用数据结构记录影响。

重要例题和简要题解

\(1.\) k大数查询:对所有操作进行整体分治,对于一个询问,根据比\(mid\)值大的数的个数进行分类,对于一个添加操作,就看添加的数是否大于\(mid\)来计算影响,进行分类。

CDQ分治

\(CDQ\)分治指的是针对时间划分来计算修改操作影响的分治算法。

思想

形式化的,\(CDQ\)分治用来解决偏序问题,核心思想就是每次分治通过部分有序的特征化简偏序限制,回答询问,计算影响,再进行归并排序。其关键在于如何抽象出其偏序的关键字,来进行分治,还有影响以及询问的计算。

更一般的,\(CDQ\)分治可以在偏序问题中顶替一层数据结构,在动态问题中可以利用时间分治的技巧转动态为静态,是一种使用范围较广,比较广义的分治算法。

重要例题和简要题解

\(1.\) 陌上花开:三维偏序模板题,可以先排序一维,\(cdq\)分治维护一维,树状数组维护一维来统计答案。

\(2.\) 好朋友的题:矩阵和用二维前缀和拆一下,拆成\(4\)个不同贡献的询问,然后\(cdq\)分治维护修改的影响和计算答案即可。

点分治

点分治指的是树上利用重心作为划分点,进行统计的分治算法。

思想

点分治是对树上有关信息进行统计的算法,其划分在于每一次选取树的重心,统计有关重心的答案,然后再删除重心,将树分为若干个不同的子树,递归处理。

而点分治的关键在于如何快速对有关重心的答案进行统计,通常来说会分为两种方法:\(1.\) 用数据结构维护统计 \(2.\) 用单调性和尺取法统计。而在使用第二种方法的时候,又会涉及到同一棵子树内的答案,需要我们重新计算容斥掉,这就在于具体的处理。

重要例题和简要题解

\(1.\) 求所有边数小于等于\(L\)的链的长度之和:每一次以重心分治,用尺取法统计答案,用树状数组维护长度和,相同子树内的答案要容斥掉。

图论

最短路及有关算法

最短路算法是由\(bfs\)拓展而来的,通常来说,\(bfs\)算法可以解决如下的最短路问题:

\(1.\) 普通的队列\(bfs\)可以解决边权唯一的最短路问题

\(2.\) 双端队列\(bfs\)可以解决\(0/1\)权最短路问题

\(3.\) 拆边后\(bfs\)可以解决小边权最短路问题

而一般的图中我们会使用如下的最短路算法:

\(1.\) \(Dijkstra\)可以在非负权图上用\(O(nlogm)\)的时间内解决单源最短路问题。

\(2.\) \(Bellman-ford\)算法可以在无负环图上用\(O(nm)\)的时间解决单源最短路问题。

\(3.\) \(SPFA\)算法可以在无负环图上用期望\(O(mloglogn)\)的时间解决单源最短路问题。

\(4.\) \(Floyed\)算法可以在\(O(n^3)\)的时间内解决全源最短路问题。

最短路算法还可以解决如下几个拓展问题:

\(1.\) 负环判定问题:在\(SPFA\)中,如果一个点入队次数超过\(n\)次,则说明图中存在负环。

\(2.\) 差分约束问题:不等式可以转化为三角形不等式的形式,于是建图用最短路求出一组最值解。

重要例题和简要题解

\(1.\) 次短路:可以从起点和终点各跑一遍单源点最短路,然后枚举每一条边,由于第二短路至多只有一条边不在最短路上,所以我们强制选这条边,用两个端点到起点终点最短路更新答案即可。

\(2.\) 逛公园:我们可以先预处理出最短路,然后用类似于最短路的状态进行\(dp\):\(f[x][k]\)代表到了点\(x\),走过的距离为\(dis[x]+k\)的方案数,利用预处理的最短路转移即可。

最小生成树及有关算法

一般来说,我们会使用如下的最小生成树算法:

\(1.\) \(Prim\)可以在\(O(nlogm)\)的时间内求出无向图的最小生成树。

\(2.\) \(Kruskal\)可以在\(O(mlogm)\)的时间内求出无向图的最小生成树。

重要例题和简要题解

\(1.\) 询问数列:区间和可以转化为前缀和相减的形式,于是询问区间和\((l,r)\)等价于建立了点\(r\)和点\(l-1\)之间的联系,若知道其中一个,可以得知另一个,那么根据询问代价建图,求最小生成树即可。

图论计数及有关算法

数环问题

\(1.\) 三元环计数:求出每个点的度数,将点以度数为第一关键字,标号为第二关键字排序,然后重构图:排名小的点向排名大的点连边。然后枚举两条边构成的路径,统计答案即可。

\(2.\) 四元环计数:用同样的方式重构图,然后再枚举路径时先枚举一条无向边,再枚举一条有向边,利用数组记录统计答案即可。

prufer序

\(prufer\)序是一种可以与带标号无根树形成双射的整数序列。

\(1.\) 树转序:每一次找标号最小的叶子节点删除,并把与其相邻的节点加入到序列中。

\(2.\) 序转树:每一次找不在树中的最小标号节点,将其和序列头连边并删除序列头。

例题:给定无根树中每一个点的度数,求这样的无根树有几棵?

给定一个点的度数相当于给定了这个点在\(prufer\)序中出现的次数加\(1\),于是就变成了数列计数问题,可以直接得到答案。

二分图及有关算法

二分图判定

染色法可以在\(O(n)\)的时间内判定一张图是否为二分图。

二分图匹配

\(1.\) \(Hungary\)可以在\(O(nm)\)的时间复杂度内找到二分图的最大匹配。

\(2.\) \(Dinic\)可以在\(O(n\sqrt m)\)的时间复杂度内找到二分图的最大匹配。

二分图的最小点覆盖和最大独立集

\(1.\) \(|\)二分图的最小点覆盖\(|\) \(=\) \(|\)二分图的最大匹配\(|\)

\(2.\) \(|\)二分图的最大独立集\(|\) \(=\) 点总数 \(-\) \(|\)二分图的最小点覆盖\(|\)

Hall 定理

设\(S\)是左边点的一个子集,设\(N(S)\)为\(S\)所有点邻居的并集,则一个二分图存在完美匹配的充要条件是:\(\forall S\ ,\ |S|\leq |N(S)|\)

重要例题和简要题解

\(1.\) 选择:对于\(x_i,y_i\),连接\((x_i,y_i)\),对于每一个联通块:若\(M>N\),则无解,若\(M=N\),则方案数为\(2\),若\(M=N-1\),则方案数为\(n\)。

\(2.\) 消毒:发现最优策略即每一次消一行或一列,那么对于病毒\((x,y)\),要么消第\(x\)行,要么消第\(y\)列,于是连接\((x,y)\),求二分图的最小点覆盖即可。

字符串

KMP

\(KMP\)算法可以在线性时间内解决字符串匹配问题。

重要例题和简要题解

\(1.\) 求一个串的最小循环节:先用\(KMP\)自我匹配,发现最小循环节就是\(n-fail[n]\)。

\(2.\) 求出每个前缀的不重叠相等前后缀数量:先用\(KMP\)求出\(fail\)数组,则对于一个\(x\),点\(x\)向点\(fail[x]\)连边,然后在树上路径上二分查找即可。

\(3.\) 构造字符串:采用贪心策略:第一个字符没有限制,就选最小的字符,之后的每一个字符,如果\(fail\)数组不为\(0\),则直接确定字符,若\(fail\)数组为\(0\),那就选取合法的最小字符。

SA

一般来说,我们会用如下方法求解后缀数组:

\(1.\) 倍增法可以在\(O(nlogn)\)的时间内求解后缀数组。

\(2.\) \(DC3\)法可以在\(O(n)\)的时间内求解后缀数组。


『正睿OI 2019SC Day2』的更多相关文章

  1. 『正睿OI 2019SC Day8-Day17』

    于是就迎来\(10\)天的自闭考试了,每天写点小总结吧. Day8 第一天就很自闭啊,考题分别是数学题+建模题+图论. 前两道题都没有什么算法,但是难度还是有的,于是就做不太出来,特别是第一题.第二题 ...

  2. 『正睿OI 2019SC Day7』

    简单数论 质因子分解 素性测试 素性测试指的是对一个正整数是否为质数的判定,一般来说,素性测试有两种算法: \(1.\) 试除法,直接尝试枚举因子,时间复杂度\(O(\sqrt n)\). \(2.\ ...

  3. 『正睿OI 2019SC Day5』

    网络流 网络流的定义 一个流网络\(G=(V,E)\)为一张满足以下条件的有向图: 每一条边有一个非负容量,即对于任意\(E\)中的\((u,v)\) , 有\(c(u,v)\geq0\). 如果\( ...

  4. 『正睿OI 2019SC Day4』

    总结 今天是一场欢乐的\(ACM\)比赛,于是我队得到了全场倒数的好排名. 好吧,其实还是怪自己不能怪队友啦.对于\(ACM\),可能最主要的还是经验不足,导致比赛的时候有点紧张.虽然队友为了磕一道题 ...

  5. 『正睿OI 2019SC Day1』

    概率与期望 总结 老师上午几乎是在讲数学课,没有讲什么和\(OI\)有关的题目,所以我就做了一点笔记. 到了下午,老师讲完了有关知识点和经典模型,就开始讲例题了.前两道例题是以前就做过的,所以没有什么 ...

  6. 『正睿OI 2019SC Day6』

    动态规划 \(dp\)早就已经是经常用到的算法了,于是老师上课主要都在讲题.今天讲的主要是三类\(dp\):树形\(dp\),计数\(dp\),\(dp\)套\(dp\).其中计数\(dp\)是我很不 ...

  7. 『正睿OI 2019SC Day3』

    容斥原理 容斥原理指的是一种排重,补漏的计算思想,形式化的来说,我们有如下公式: \[\left | \bigcup_{i=1}^nS_i \right |=\sum_{i}|S_i|-\sum_{i ...

  8. 正睿OI国庆DAY2:图论专题

    正睿OI国庆DAY2:图论专题 dfs/例题 判断无向图之间是否存在至少三条点不相交的简单路径 一个想法是最大流(后来说可以做,但是是多项式时间做法 旁边GavinZheng神仙在谈最小生成树 陈主力 ...

  9. 正睿OI DAY3 杂题选讲

    正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n ...

随机推荐

  1. android studio学习----构建(gradle )依赖时使用动态依赖的问题

    今天在看Dan Lew大神的博客发现最新的文章就是 “Don't use dynamic versions for your dependencies” Everyone, please, to st ...

  2. contab路径问题(脚本调用另一个文件)

    问题描述 当在定时任务里,要执行一个脚本A,然后A脚本需要调用另一个文件B,此时定时任务执行不成功,会报错找不到文件   解决办法 先cd到放执行脚本的路径,这样就在定时任务的脚本里可以调用相对路径下 ...

  3. windows环境下基于nginx搭建rtmp服务器

    基于nginx搭建rtmp服务器需要引入rtmp模块,引入之后需重新编译nginx linux环境几个命令行就能实现编译,笔者未尝试,网上有很多教程. windows环境还需要安装一系列的编译环境,例 ...

  4. Nginx应用详解及配置

    一.Nginx简介 概述:Nginx是一款由俄罗斯开发的开源的高性能HTTP服务器和反向代理服务器,同时支持IMAP/POP3/SMTP代理服务,其性能优势着为显著,官网上称:单台nginx服务器可以 ...

  5. 04、rpm+yum+tar解压

    Linux 下安装软件: 1.rpm 软件包的安装 一般安装都用 rpm -ivh 包路径及名字 如:rpm -ivh /soft/RealPlayer11GOLD.rpm   --安装/soft下 ...

  6. Alipay 支付类

    本版本参考网友 <?php namespace App\Tools; class Alipay { //应用ID,您的APPID. private $appID = '111'; //商户私钥 ...

  7. Java精通并发-Condition方法实现分析与讲解

    在上两次已经对Condition这个类的javadoc进行了完整的解读,接下来则对它里面的方法进行一下纵览,并进行官方的解读,如下: 下面一一来读一下各个方法的说明: await(): 上面这段说明已 ...

  8. SpringBoot全局Jackson配置未生效

    在做一个小项目,后台服务第一次用SpringBoot构建.接口使用Json格式,在application.properties中配置如下: spring.jackson.default-propert ...

  9. java.time.format.DateTimeParseException: Text '2019-10-11 12:30:30' could not be parsed at index 10

    java.time.format.DateTimeParseException: Text '2019-10-11 12:30:30' could not be parsed at index 10 ...

  10. scapy构造数据包

    一.进入scapy交互界面 在终端下输入:scapy ,进入交互界面: 二.查看scapy已经实现的网络协议 ls() 列出scapy中已实现的网络协议 ls(协议类型) 查看某个协议头部字段格式 l ...