OI中一些常见实用的套路【更新中】
数据结构
- 在维护树上路径时,如果只是点的独立的加减,可以考虑用括号序来维护(拆成两部分)
- 需要求树上很多路径中k近/距离和 一类,考虑点分治/在点分树上解决。
- 子树求和可以转化为DFS序上区间求和
- 树状数组可以区间查询/修改(差分)
- 需要查询序列上区间数据结构,只要满足总和是可以接受的范围,可以用线段树,每个区间维护一个这样的数据结构(例如AC自动机等)
- 多维偏序问题,排序可以降维,CDQ分治可以降维,剩下只需要树状数组/线段树
- 树上连通块有概率出现,再加上和的次方,往往可以拆开来,变成任意选K个可重,有序的点,考虑贡献。
- 当又需要分块,每个块维护数据结构时,块的大小考虑调整(不再一定是\(\sqrt n\))(平衡规划)
- 同理,对于图论中度数总和固定、多组询问查询的点数固定,查询点需要枚举出边,但可能一直查询度数比较大的点。此时考虑平衡规划。(询问点个数/度数 大于/小于\(\sqrt n\)分开来做)
- 对于点分治时两个不同的子树的结果混在一起需要判掉,可以考虑几种办法:
- 在点分树上儿子记录当前点分树子树中的节点到父亲的结果,计算父亲时在这里减去。
- 维护DFS序,两个子树对应两个无交的区间,可以考虑区间分裂一类的做法。
- 对于有很多颜色的点,需要对相同颜色计算影响,可以把每个颜色拉出来在DFS序上搞事情(相邻+1,lca-1一类)
- 如果又加上了深度限制,那么相当于除了DFS序这一维,还多出了深度这一维,可以考虑(主席树/CDQ分治/二维数据结构)
- 对于这样一类问题:每个元素(边/点之类)具有权值/权值范围,每次只需要考虑权值是一定值/一定范围的元素的影响,可以考虑建立权值线段树,将元素的影响挂在线段树对应的所有区间上,查询就查询区间。
- 当需要查询树上是否存在一条路径过两个点时,可以将路径端点记在DFS序上,然后两点子树查询,这就变成了两个区间数点的问题(二维偏序/扫描线/DFS动态树状数组维护增量)
- 需要维护序列轮转问题时,不一定非要splay,如果轮转很特殊时可以采用线段树+预留空位的形式转化为单点修改。
- 想要存储很多东西的0/1状态,且需要支持xor/or/and等操作时,bitset是个非常好的选择(计算复杂度可以除以32),别忘了bitset还有左移右移操作,可以用来处理+或-
- 替罪羊树跑的很快。
- 带旋转的平衡树是很难在内层套上线段树的,所以平衡树套线段树应考虑替罪羊树或treap
- 一堆操作+询问的题,如果很容易处理一堆操作对一堆询问的贡献,可以考虑分治,你可以考虑权值/时间分治
- 一棵Trie如果要维护+1异或,那么不妨从低位到高位建Trie
- 线段树分治往往应用在一些对象知道插入和删除时间时,维护合法情况很容易,但撤销非法情况比较困难时。
要算一个点和一堆点的距离的时候,可以考虑将距离拆成两点深度和-2*lca深度,lca深度可以表示成lca到根的节点数,那么直接树链剖分链上区间加区间求和即可。
图论
- 求点双连通分量栈中仍然可以存点,圆方树维护起来很方便。
- 无向图中最大值最小的路径一定在最小生成树上
- 合并两个连通块的直径,直接比较四个端点两两连起来的长度即可。
一些有代价的完美覆盖问题,选格子有行列限制有代价/收益的题往往考虑网络流。
多项式
碰到诸如\(\prod\limits_{i=1}^{n}(1+p^ix)\)的时候,先不急着分治NTT,它既可以多项式ln+exp,又可以倍增。显然倍增更快。
其他
- 如果遇到\(n^3\)的转移矩阵,但是我们一次只想知道的结果是一维的(即暴力乘的复杂度是\(n^2\)),那么可以考虑倍增预处理转移矩阵的幂,求出转移矩阵\(2^0,2^1,2^2...\)次的结果。询问的时候只需要\(n^2\log\)而不是\(n^3\log\),预处理则是\(n^3\log\),总的复杂度就可以变成\(q*n^2\log+n^3\log\)
- DP时,如果状态很大,结果很小,可以考虑能否将结果与状态互换。
- 涉及网格图带权,行列选择限制/覆盖一类的问题,可以考虑网络流。
一个经典问题:有一个序列,给出若干个区间,问有多少种选法使得选出的区间能覆盖整个序列。 我们考虑容斥,显然容斥系数是(-1)^强制不覆盖的位置个数,记f[i]为前i个位置都已经确定了,第i个位置不选的方案数和,它可以从\(f[j]*(-1)* 2^k\)转移而来,我们把所有区间挂在右端点,从左到右扫的时候做区间乘法即可。
OI中一些常见实用的套路【更新中】的更多相关文章
- PHP 日常开发过程中的bug集合(持续更新中。。。)
PHP 日常开发过程中的bug集合(持续更新中...) 在日常php开发过程中,会遇到一些意想不到的bug,所以想着把这些bug记录下来,以免再犯! 1.字符串 '0.00'.'0.0'.'0' 是 ...
- 【python】实践中的总结——列表『持续更新中』
2016-04-03 21:02:50 python list的遍历 list[a::b] #从list[a] 开始,每b个得到一个元组,返回新的list 举个例子: >>> l ...
- WCF之常见异常整理(不断更新中...)
系统Win7 IIS7.5 异常1.找不到具有绑定 NetTcpBinding 的终结点的与方案 net.tcp 匹配的基址.注册的基址方案是 [http]. 产生原因:网站没有配置net.tcp ...
- 3.C#/.NET编程中的常见异常(持续更新)
1.Object reference not set to an instance of an object. 未将对象引用(引用)到对象的实例,说白了就是有个对象为null,但是你在用它点出来的各种 ...
- 14.C#/.NET编程中的常见异常(持续更新)
1.Object reference not set to an instance of an object. 未将对象引用(引用)到对象的实例,说白了就是有个对象为null,但是你在用它点出来的各种 ...
- GIT实用操作指令(更新中)
提取多次提交的文件 git archive --format=zip HEAD `git diff --name-only 较早的提交ID 较晚的提交ID` > diff.zip
- css 不大常见的属性(不断更新中...)
1 英语或数字强制换行 word-break:break-all; 2 使用具有回弹效果的滚动, 当手指从触摸屏上移开,内容会继续保持一段时间的滚动效果 -webkit-overflow-scroll ...
- Android中的常见通信机制和Linux中的通信机制
Handler Handler是Android系统中的一种消息传递机制,起作用是应对多线程场景.将A进程的消息传递给B线程,实现异步消息处理.很多情况是将工作线程中需要更新UI的操作消息传递给UI主线 ...
- vue中的一些用法,持续更新中......
1.跳转用法 @1.在template模板中通常使用router-link to='url' @2.在js中 1.this.$router.push({path: ''/order/index''}) ...
随机推荐
- canvas基础API
1.路径绘图: 把“钢笔”移动到画布的某个位置上 ctx.moveTo(x,y) 把“钢笔”连线到画布的某个位置上 ctx.lineTo(x,y) 描边路径的api ctx.stroke() 填充路径 ...
- Zend_Controller_Front 研究
如果你裸写php,一个项目就会出现很多的页面控制器(Page Controller),如果项目很大,重复代码就很多,越来越变得很难维护.有了问题,自然就有解决方案!于是前端设计模式 闪亮登场! 前端 ...
- (2)-生成JSONObject的方法
生成JSONObject一般有两种方式,通过javabean或者map类型来生成.如下面的例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2 ...
- 如何注册GitHub
一.个人介绍 姓名:张志龙 学号:1413042026 班级:网工141 爱好:宅物 能力:c++编程 二.注册 注册GitHub其实很简单 首先我们要做的是打开官网 www.github.com(如 ...
- 疑难杂症--在Windows Server 2008 R2上运行SQL Server 2008情况下,CPU过多导致的问题
64位的Windows7和Windows Server 2008 R2为了能够在一台机器上,支持超过64个逻辑CPU, 引入了Processor Group这个概念.Processor Group会把 ...
- Jenkins HA高可用参考
商用版Jenkins(CloudBee)提供HA插件,开源版本可以借助etcd服务发现+心跳脚本+sync的方式实现高可用.
- GO学习笔记 - 数据类型转换
官方教程:https://tour.go-zh.org/basics/13 表达式 T(v) 将值 v 转换为类型 T . 一些关于数值的转换: var i int = 42 var f float6 ...
- linux命令之用户管理及用户信息查询命令(下)
1.visudo:编辑sudoers文件 该命令专门用来编辑/etc/sudoers文件,同时提供语法检查等功能. 示例: 1)执行visudo对普通用户授权 [root@boxiaoyuan ~]# ...
- E - More is better (并查集)
点击打开链接 Mr Wang wants some boys to help him with a project. Because the project is rather complex, th ...
- 【文文殿下】洛谷P2408 不同子串个数
题目链接https://www.luogu.org/problemnew/show/P2408 SAM裸题,大力求就行了 #include<cstdio> #include<cstr ...