首页 > 其他分享 >cc000的小仓库

cc000的小仓库

时间:2022-11-05 21:38:27浏览次数:60  
标签:仓库 线段 然后 枚举 DP 单调 cc000 就是

这篇文章也许有许多谬误或不足,如果你看见了,请务必告诉我,感激不尽!

图论部分

最短路

floyd

复杂度 \(O(n^3)\) ,可以求任意两点最短路,适用于很多情况(除了负环的情况都行)

如果你想限制最短路的步数,可以用倍增 floyd (其实就是矩阵乘法,乘一次就相当于做一条边)

然后就是有时候求最短路的步数也可以用倍增floyd 解决,比如说 [POI2015] WYC

我刚才看到有大佬讲 dp 的博客下面写floyd本质上是一种 2d/1d 的dp,一想好有道理

spfa

他死了(我不到 noip 级的比赛卡不卡啊)

用队列维护可以用于松弛的节点

用他判断负环的方式就是判断到这个点经过多少条边,因为如果大于等于 \(n\) , 那么就是有负环

但是这个容易被卡,最坏 \(O(nm)\) ,(其实没有更好的判负环的方法了www

upd:需要注意的是判断的不是松弛次数,而是入队次数!

还有我想说的就是当边权为 \(1\) 的时候 spfa 本质上就是 bfs ,且时间复杂度为 \(O(m)\)

dijkstra

单源最短路,用优先队列实现的复杂度为 \(O(m\log m)\)

只能在非负边权上使用

因为 dij 本质上是一种贪心,而这个贪心策略在只有非负权边的时候是对的

upd:我学到了一些奇怪的东西:有向图中只有起点向外连的边有负权且没有向起点连的边的时候是可以用 dij 的,因为这时候只有起点是确定松弛过的,所以起点连向的点也是对的,后面的就没有影响了。

01 BFS

适用于边权只有 0 或 1 的最短路。

BFS 本身就适用于边权只有 1 的图的最短路

01 BFS就是将没有边权的放到队首,有边权的放到队尾,然后从队首开始扩展

可以用 STL 的deque实现。但是要注意空间常数。

树上问题

唉这个东西好像挺多

lca

树剖

好东西,别忘记第二次 dfs 时判断重儿子不往下走,要不然寄了都不知道咋回事

然后树剖上让你换根的话就套线段树,分类讨论,CF916E题解

倍增

好写,但是我不太经常写。毕竟他没树剖快

然后就是在链上向上跳的时候是个好写好用的东西。

rmq 的我没咋用过,就是查询巨多的时候很快呗。但一般情况下树剖是最快的(((

tarjan

没啥用啊

各种常用手段

树剖+线段树

用于维护某一条链上信息,先求树剖序,然后在维护链上信息时,跳一次 top 就更新一次。

询问子树信息就是在树剖序上长度为 siz 的一段区间

dsu on tree / 线段树合并

好久没写这种题了好像

放在一起是因为这两个都擅长维护子树信息

dsu 的流程就是先统计轻儿子的信息,统计后删除,再递归重儿子,信息保留,等到回到这个节点时再把轻儿子的信息统计进去。复杂度正确是因为树剖的性质

显然有关子树的问题比较合适

线段树合并的话就是每个节点维护一棵线段树,然后边合并边查询信息。这个东西的话经常套树上差分吧,因为修改可能麻烦,线段树合并的过程中又直接就合到一起去了

长链剖分

因为我刚学,所以我会开个新坑好好讲讲

新坑填完了 link

用到 k 级祖先的时候就直接上就行了

一般可以用来维护深度相关的信息,DP 里如果有与深度相关的维度的话就可以用它

而且在一些情况下,可以和 dsu,线段树合并互换

树形DP

会在DP 那里细讲

基环树

基环树的话我知道两种思考方向(?可能也是我太菜了见得太少了)一种是树形 dp 的时候把状态再设出两维用来单独计算的,好像如果是算相邻的边的贡献比较好用?,所以就是 [COCI2021-2022#1] Logičari 这道题的状态。

然后还有一种是把基环树环上所有的点都当作根,整棵树就等价于把一堆根用边连在一起了,所以可以分类讨论之类的了,具体的话是这道题 [POI2012]RAN-Rendezvous

杂七杂八

给你一堆链,如何求这一堆链里两两有交集的对数

一条链以 lca 为界拆成两条链,然后转化成序列上有交集的线段数,然后直接前缀和啥的做就行。

然后对于起点相同以及lca 相同且所在分支相同的要去一下重。

拓扑排序

dag 上用的很多的东西。

dag 上dp 的话就跑不了他了。

[POI2014]Rally 是按照拓扑序枚举被删除的点,然后把点分成两个集合,这样就能容易的删掉贡献。

在一些有顺序要求的题里可以用

然后注意 tarjan 缩点的顺序就是拓扑序的倒序

判断有无环就是跑一遍拓扑排序。

思想上很有趣的是 这个

最小生成树

Kruskal 算法本身也没啥,就是贪心。

给一张图,他问你怎样不成环就是问最小生成树之类的。然后如果限制 \(k\) 个点不在环上,就是把跟这 \(k\) 个点没有关系的边全都先建出来,然后对剩下的点进行类似最小生成树的东西,也就是用并查集判环

我翻到一道好题

CF1023F就是一定保证每条后加的边都在 MST里,就显然那 \(k\) 条边都在 MST 里,就是让它们边权等于 0 ,然后考虑没被插入 MST 中的给定边权的边,它不被加进去的原因一定是它比最大值要大,这样,每个未被加进去的边就是对整条路径上的限制,对整个路径上的点都与这条边权取 \(\min\) 。就是需要注意的是原有在最小生成树里的有边权的边在做之前要设成 0 。

我等下会补上次小生成树和kruskal 重构树的

我回来了

首先次小生成树。

次小生成树和最小生成树只有一条边的区别。所以只需要枚举没被使用过的边,然后在这条边连的路径里找到一条最大的边删掉就行了

严格次小生成树就是因为在找边的过程中一条路径上的最大值可能与要换进去的边相同,所以在一条链上要维护最大值和次大值。树剖套线段树啥的就行

然后是 kruskal 重构树

关于怎么构树:

  1. 也是和kruskal 生成树一样,按边权排好序,同时准备好一个并查集。

  2. 每次找到一条边,如果这条边的两头连接不同的联通块,就找到各自的祖宗,并新建节点,把它和两个祖宗连起来,作为新的祖宗。新点的点权为原边的边权。

关于它有什么性质

  1. 生成的新东西就是棵二叉堆,所有原图上的点都是叶子节点。
  2. 假如是小根堆,那么从 \(a\) 到 \(b\) 路径上的点权最小值,也就是 lca 的点权,是原图从 a 到 b 的路径最小的边权的最大值

主要可以解决最小生成树的最大边权问题,比如一张无向图中两点间的最大边权的最小值(就是两点间的 lca)。栗子:NOIP2018货车运输虽然刚开始并不是这么做的,当时求最大生成树,然后树剖线段树求最小值)

然后经典应用就是 从 \(u\) 出发不经过边权超过 \(v\) 的边能到达的节点的问题,就比如 NOI2018归程,这题就是求从 起始点到某一节点最大路径值不超过 \(v\) 的路径中,离 1 最近的是哪一个,

我翻到一道例题 BZOJ3545 Peaks ,我还没写,不过跟归程差不多

差分约束

一般题目里会给一点性质或者是用二分搞出来一堆不等式组,然后把不等式组转化成最短(长)路,无解就是有负环(或正环)。

然后详细信息这边走 link

然后像 Intervals 是要转化成选或不选的前缀和数组,然后用差分约束来限制合不合法

差分约束的话,还很有可能和缩点tarjan联系到一起,因为有的时候 spfa 的复杂度过不去,或者是并不能在环路上直接解决了,而连的边有一些性质(比如有边权的边是双向的,0 边权的是单向边),缩完点之后变成 DAG 就能用拓扑排序解决问题,比如 [SDOI2011]糖果[POI2012]Festival 都是先缩点,然后在DAG上做的

关于建图

用差分约束的思想可以建出来好多图,可以把看似不相关的问题转化成图论问题。

如果需要区间连边之类的,可以考虑线段树优化建图,如果还是不会的话考虑一下建一个辅助点。

一道挺板子的优化建图:POI2015PUS

还有分层图,在题目给出了一些肉眼可见特别小的条件之后可以往这方面想,[JLOI2011]飞行路线 就是这样的东西,在每层之间所有都连上边权为 0 的边。

还有一个思考的稍微深入一点的就是 [USACO21JAN] Telephone G。其中的绝对值就可以抽象成两点间的距离。

像一些隐蔽的条件也可以是分层图。比如 [USACO18DEC]Fine Dining G 的条件是某些条件只能用一次。

咕咕咕咕的清单

点分治,边分治, LCT ,虚树这些东西如果我活到联赛之后我就写

唉图论还有啥,好像没了。网络流好像也算,而且那玩应出了我必写不出来。省选级知识点是吧,那我咕了,回头还是活到联赛之后就写。


DP

重头戏来了!

DP的话,要说的还是很多,尽可能把各种思路都详细说说。

区间 DP

就是如果能将区间信息合并起来的话就可能是区间 DP。一般能将问题变成两两合并的形式。就是设 \(f_{i,j}\) 为将 \(i\sim j\) 的区间内合并的答案,然后在中间枚举最优决策点。(但其实不是这个套路的题比是这个套路的题多好像

不过状态和思路其实好多可以这么想

最经典的就是 石子合并

来一道简单练手题吧 [USACO21FEB] Modern Art 3 G

像板子一点的是 [USACO16OPEN]248 G ,但是这个题的区间长度并不固定,所以不把它放到状态里,而是作为答案转移。

额额额我回头再找点题

[SBCOI2020] 一直在你身旁 是一道单调队列好题,但是 \(n^3\) 的状态的定义是用区间 DP 的方式想的。

然后就是 [POI2015] MYJ 这道题的比较人类智慧的状态定义。就是设 \(f_{i,j,k}\) 表示从第 \(i\) 家到第 \(j\) 家,最小值为 \(k\) 的最大收益的和。然后要枚举也是分割点,还要找到对于所有属于 \([i,j]\) 的区间中,每个点被多少区间越过去了。

然后转移就是这样的 \(f_{i,j,k}=\max \{f_{i,l-1,k}+f_{l+1,j,k}+cnt_{l,k}\times k\}\) ,其中 \(cnt_{l,k}\) 表示经过 \(l\) ,\(c\) 大于等于 \(k\) 的区间个数。然后发现 \(k\) 不重要,只关心他和 \(c\) 之间的关系,所以离散化一下,复杂度 \(O(n^3 m)\) 的。

背包

01 背包很简单,就是设 \(f_{i,j}\) 表示到第 \(i\) 个人,装了质量为 \(j\) 的总物品的最大权值。

然后是完全背包。完全背包的状态也是上面的那个,但是如果枚举每个物品出现的次数是 \(O(n^3)\) ,不过并不需要

f[i][j]=max(f[i][j-w[i]],f[i][j]);

这样就是 \(O(n^2)\) 的

多重背包就是同种物品有 \(k_i\) 个,解决办法就是把每种物品拆成 log 个,就是 \(w_{i,j}\) 表示第 \(i\) 种物品有 \(2^j\) 个的质量,然后做 01 背包就行。这叫做二进制分组

然后是单调队列优化多重背包。

朴素的转移是 \(O(n^3)\) 的。显然,\(f_{i,j}\) 会影响 \(f_{i,j+k\times w_i}\) 。

在下图中,只有相同颜色的格子会互相影响

所以我们把相同颜色的格子分组(按照除 \(w_i\) 的余数分组),对于每组的转移单独考虑。

然后就可以单调队列了,单调队列维护的是价值最大,长度是 \(k_i\) 。

时间复杂度的话,是 \(O(nV)\) 的

但是我还是习惯写 \(\log\) 的做法。

背包的好题的话,啊我好像没做多少www

回头再找找

树形 DP

普通的树形 DP的话,可能把子树作为状态的比较多吧。

但是好像也不是吧

然后树形 DP 的话还有几类

  1. 树形背包:如果枚举的是子树,复杂度是 \(O(nm)\) 的
  2. 换根DP:通常有两遍 dfs,第一遍枚举以 1 为根的信息,第二遍将父亲之上的信息合并到儿子上
  3. 基环树:可以先找到哪条边是多余的,然后再转移的过程中考虑这条边的影响((

找两个有趣的树形 DP 的状态设计和转移挂在这里吧

树形 DP 有时候思路是将子树的信息合并到父亲上会方便一点吧。

[HEOI2013]SAO

题面题解

首先,它是个树形 DP。

首先不考虑树的边的方向,那么就是一棵树。树的话,设 DP 状态为 **\(f_{i,j}\) 表示第 \(i\) 个节点,当前节点在 \(i\) 的子树内排名第 \(j\) 的方案数 **。

然后需要考虑的就是 \(p\) 与 \(v\) 的在序列中位置关系。分类讨论,加上组合数就行了

[POI2014]HOT-Hotels

题面题解

首先我们设 \(f_{i,j}\) 表示第 \(i\) 个节点,子树中到 \(i\) 的距离为 \(j\) 的点数。

\(g_{i,j}\) 表示第 \(i\) 个节点,子树中二元组 \((x,y)\) 满足 \(dis(lca(x,y),i)+j=dis(x,lca(x,y))=dis(y,lca(x,y))\) 的个数

那么答案就是 \(ans+=g_{p,0}+\sum f_{p,j-1}\times g_{v,j+1}\)

同理,这题也可以用dsu on tree 和线段树合并做,一样的。这就是说的长链剖分优化树形 DP 的好例子,如果还有的话我会再加。

[COCI2020-2021#1] Papričice

link

虽然它是个绿题,但是不好想

基本思路就是固定删掉一条边,求出另外一条边是什么。我们想让删掉一条边后剩余子树的两头尽可能平均。然后二分。但是祖宗的部分可能会出问题,所以要把祖宗和其他亲戚分开二分,然后取最优。二分可以用 set 完成。

[COCI2020-2021#2] Svjetlo

link,题解

就是设三个状态,分别表示路径头都在子树内,一个在子树内,都在子树外的方案数。然后可以互相转移。

其实超级麻烦的

[COCI2014-2015#1] Kamp

题面

把求解过程拆成两部分,一部分是回到起点的路程,另一部分是求从当前点开始的最长链。然后相减。需要精细地分类讨论一下

JD 1024 删边

题面,题解

维护一颗去掉某个子树的树的最长链。需要维护最长链,次长链,和次次长链

POI2015 MOD

这题是删边的加强版,就是找到删那条边之后再找一下直径就行了

状压dp

可以观察数据范围确定是否要用状压dp

有时候可以作为部分分出现。

挂两道题看一下吧

好像有几道题都可以说是把图形压成几进制状态的,还有就是一个数能有的不同质因子很少,有时也可以把前几个质因子压起来,然后剩一个大一点的质数单独考虑

子集枚举(\(O(3^n)\)):

for(int j=i;j;j=(j-1)&i)

超集枚举

for(int j=i;j<mx;j=(j+1)|i)

[NOI2001] 炮兵阵地

题面

状态包括当前行,这一行的状态,上上行的状态。然后就是判断一下就行了。

还有就是如果硬枚举一定不行,不过有一些状态从一开始就一定不合法,到时候就是判一下就行。

[NOI2015] 寿司晚宴

状压 DP 的一个常见套路就是枚举一个数有多少质因子的。因为一个数最多不超过 8 个不同的质因子,所以正好能压到一起。

然后这样之后常见应用就是判断两数互质。因为对于一个数的质因子二进制状态,如果另外一个数对应的二进制状态跟他有交集就一定不互质,否则一定互质。

这题还有个事情就是一个数以为大了一些,所以不能直接压,但是仍然没有超过 22 的质数,所以可以按照大质数排序,并且按照这个大质数对应的数放在哪边分别看一下,然后合并就行了。

JD2190 二维黑白棋/[CEOI2002] Bugs Integrated,Inc

把没有棋,横着放,竖着放,分别看成一种情况,三进制枚举。

写记搜比较方便

[NOIP2016 提高组] 愤怒的小鸟

link,是原题诶

状态的话,枚举的是把 \(S\) 状态下所有猪都打死的方案数。

概率期望 DP

我可害怕他们考这玩应了。因为我有时候真的分析不明白 www

我不到说啥啊。我真没做过几个题啊啊啊

[NOIP2016 提高组] 换教室

link

其实并不是很复杂的东西,需要预处理最短路。其实乘上一个概率也不难

AT4531 Sushi

link

考虑到每个盘子里最多三个寿司,所以设 \(f_{i,j,k,l}\) 表示剩 0 个的盘子 \(i\) 个,剩 1 个的盘子 \(j\) 个,剩 2 个的盘子 \(k\) 个,剩 3 个的盘子 \(l\) 个。然后复杂度 \(O(n^4)\)

然后很经典的事情就是 \(l\) 可以用 \(i,j,k\) 算出来,然后就记搜转移一下

题解

仓鼠找 sugar II

link

设状态 \(f_p\) 是从 \(p\) 向上走的期望步数,\(g_p\) 是从父亲走向自己的期望步数。然后就分情况讨论一下就好了。最后就是把所有可能的情况加在一起就行了。

题解

数位 DP

去年第一次考,我的评价是寄了。

奶一口今年不考。

其实数位 DP 的状态一般就是到第 \(i\) 位,第 \(i\) 的数字是 \(j\),这一位的数字有没有最大限制以及限制是几,有无前导 0 的答案

其实很多数位 DP 的状态的特别像(应该还是我做的题太少了 QwQ)

数位 DP 不会做的话就硬往上加状态就行?

[CQOI2016]手机号码

题面

就是设的状态和前面都差不多,然后加两维表示前两位都是什么,再加两维表示 4 和 8 出没出现过

[NOIP2021] 数列

题面

鼻子发酸,好痛苦.jpg

我今年肯定至少打出来 50 分对吧,呐,会的吧,呐。

100 分的也不难(((

50分的就是设 \(f_{i,S}\) 表示到第 \(i\) 个数,当前的二进制状态是 \(S\) 的可能方案的权值和。然后还挺好想的。

唉其实你说他数位 DP好像不是很典型的样子。

设 \(f_{i,j,k,l}\) 为现在要分派的值为 \(i\) ,已经有 \(j\) 个数被分配到了值,更低位有 \(k\) 个 \(1\) 要进位到 \(i\) 上,现在已经有 \(l\) 个 \(1\)。

然后枚举现在要分配 \(p\) 个\(i\) ,然后乘上 \({a_i}^p\times C_{n-j}^i\) 转移到 \(f_{i+1,j+p,\lfloor \frac {p+k}{2}\rfloor,(p+k)\%2}\)

喵。结束了喵。

CF55D Beautiful numbers

link

首先就是 \(x\) 要为所有数字位上的最大公倍数的倍数。

因为所有的数字的最大公倍数是 2520,所以这个东西可以加进状态里。

2520 可能会 MLE,而且有用的数字(可能出现 lcm 的)最多为 48 个,所以能离散化。

单调队列优化 DP

这个单独拎出来讲是因为我这两天做了好多题。

其实如果你发现 \(n^2\) DP 在某些方面上有单调性,就可以考虑用单调队列优化。一般是求区间最值或者是用来降低 DP 的维数的。

我这么说好像说不明白。(((

最大全 1 正方形

枚举右上角的端点,先预处理出每个点能向下延伸的 1 的 长度,然后单调队列里维护最小值。如果是最大的 01 正方形就按照奇偶重新赋个值。

[POI2015] WIL

题面

题解

首先可以认识到的是被选中的区间如果随着右端点的右移,左端点一定单调不降,于是可以用个双指针维护最优的右端点。找到一段区间后,我们要找消除掉哪一段区间,于是我们想到前缀和减去它往前 \(d\) 个前缀和的最大值是能减少的最多的值,所以我们用一个单调队列维护

[CSP-S2019] 划分

题面

题解

\(O(n^3)\) 的随便写。

\(O(n^2)\) 是因为从 \(j\) 转移到 \(i\) 的中间分割点为 \(k\) ,从 \(j-1\) 转移到 \(i\) 的分割点一定在 \(k\) 左边。所以寻找分割点是均摊 \(O(n)\) 的。

\(O(n)\) 的是化简一下式子,然后发现 \(j\) 的决策也有单调性,所以只需要找合法的最大贡献的就行了,因为块越小越优,所以队列单调递增。

一直在你身旁

题面

题解

首先,用区间 DP 的方式想到 \(O(n^3)\) 的转移,然后分情况讨论,一种是直接维护就行,另一种是用单调队列维护最小值。

[Code+#3]寻找车位

题面

题解

是最大正方形的动态版。

但是他告诉你了 \(m\leq 10^3\) ,所以用暴力一点的思路,按照 \(n\) 划分线段树,在每个节点上暴力的维护每一个 以 \(j\) 为右侧的边时最大正方形 ,然后用单调队列维护,在合并节点时只需要考虑一段区间内以 \(mid\) 为分界线合并。

广义矩乘优化 DP

首先他 CSP 考了,而且我连思考的余地都没有,而且这玩应其实我 CSP 前练了有一些了,考的那道题特征也很明显,我考场也看出来了,但是我没做出来,总之我 CSP 爆炸了。

CSP 考了 NOIP 必不考((((

广义矩乘的题特征我能知道的都很明显。

首先是朴素的方程十分好写,然后是存在区间查询或者修改操作。

然后主要符合且常用的结合律就是外层 \(\min,\max\) ,里层加,或者是朴素的矩乘。

然后其实拿着朴素的方程硬写就能写出来矩乘。

然后架到线段树上就无所不能。

序列上就是这样,树上就是维护个树剖序,如果带修的话就是稀有的 DDP。

DDP 本身也是就直接按照树剖的性质做的,也没啥东西。就是需要维护轻儿子信息,然后修改的时候边跳重链边改,因为跳重链就是在轻儿子上往父亲跳。

决策单调性

我感觉决策单调性的规律一般是对于一个决策点,考虑它比另外一个决策点优的时候需要满足什么条件,如果这个条件也满足什么优秀的性质的时候,就可以考虑决策单调性。

然后考场时间如果充裕可以打个表看一下。

斜率优化

推式子

好多式子都有平方项,或者是有两项相乘,这样构造出两个分别属于 \(i\) 和 \(j\) 的东西相乘,也许会能有斜率优化的机会。

cdq 套斜率优化好久没写了(─.─|||

关于 DP 我还有要说的

一些 DP 的思路是很重要的。

比如大多数如果是一些限制条件不会放到状态里,为什么不考虑把他放到转移的对象里呢?就像 [POI2012]Cloakroom,给一些原有区间,和一些询问区间,要求所有给定区间都在原有区间内部,而且还要满足背包的条件,这样即使排过序也不好把包含区间的限制放进状态里。所以我们设计的状态就是 \(f_i\) 表示正好价值是 \(i\) 的所有区间的最大右端点的最小值,按左端点排序,这样边转移边求答案,就能对于每个询问都看一下 \(f_k\) 值是否大于当前区间的右端点,从而判断是否可行。

还有就是直接维护可能很困难的东西可以用增量法维护,换一个角度考虑加入一个什么东西后的影响。这是我突然想到的,题我忘了。

数据结构

前缀和和差分这种入门的我居然想不到啥。

回头补补

有一个就是如果区间加一个等差数列就是在差分数组上区间加

线性数据结构

单调栈,单调队列。

他们都能用来离线的解决类似区间最值问题。单调队列可以解决的是某一段区间内的最值,单调栈主要是以某个值为最值的区间之类的。

有关单调队列的栗子好像在上面说了,那这里简单讲讲单调栈吧

单调栈的话,比较典型的是求某个数前面第一个比自己小(大)的数的位置,好多问题也可以先求出这个东西吧。

[COI2007] Patrik 音乐会的等待

其实吧,这题不咋难,但是我总一下转不过来弯

其实就是维护一个单调递减的栈,栈内相邻元素之间互相一定能看见,所以在入栈的过程中,被弹的元素也一定能和入栈元素相互看见,然后如果最后栈内非空,就还能和此时的栈顶互相看见

线段树

好东西哇

普通的用法就不说了。

每个线段树的节点上维护单调队列单调栈什么的就可以合并左右儿子信息,

然后参考小白逛公园,可以在线段树上维护结构体来进行子序列之类的维护,比较难一点的就是 CF280D, 这个 \(k\) 的限制只需要每次取最大子序列,然后整体取负,这样就需要维护最大子段和和最小子段和来应对取负的操作。

线段树合并

其实线段树合并比较常见的是树形结构,用来维护树上信息,(其实它能做的dsu on tree 基本都能做)

然后就是它的复杂度,每次线段树合并的复杂度是重合的节点个数,如果 \(n\) 棵线段树都一开始只在一个点有值,那么每棵都是一开始有 \(\log n\) 个节点,全合并起来的复杂度就是 \(O(n\log n)\) 。

但是假如说每次都是满满的线段树进行合并,复杂度就是 \(O(n^2\log n)\) ,所以有的时候复杂度会假掉 QAQ

线段树分治

有时候什么东西对整个区间的影响就是在一段时间内的,查询是在一个时间点上的询问。

我对他的印象就是和各种数据结构套在一起

他有好用的思想就是用的时候先计算贡献,不用了就把贡献删除。

trie

我感觉这个是个小巧玲珑又好用的东西

如果是在字符串上,也许可以用来 DP,

如果是异或相关的题,就可以往 trie 上想,是个很有用的东西。

trie 上可以维护 DP,就像 CF1720D2,题解

然后有一个 trick 就是如果有全局加一和求总异或和的时候,全局加一就是从低位到高位建树,然后交换所有遇到的左右儿子,然后向交换后的 0 的方向继续递归(就像进位那样能理解吧)

然后这个 trick 有两个题 [省选联考 2020 A 卷] 树,和 [Ynoi2010] Fusion tree

分块

像这个众数之类的线段树什么的维护不了的东西就可以用分块了,比如 [Ynoi2019 模拟赛] Yuno loves sqrt technology III 就是用分块的方法(他可以做空间 \(O(n)\) 的,也可以做 \(O(n\sqrt n)\) 的)

然后遇到几个题,就是每个多少个数修改一下的就也是分块,隔的数比较大就暴力,比较小就用类似前缀和的思想维护,序列上就是Ynoi 初始化,树上的就是 [POI2015]ODW (啊不对这个不叫分块,应该叫根号分治,但是我总觉得跟分块如出一辙)

字符串

最重要的就是哈希吧。

哈希的话就是把它想象成 base 进制数就行了。

拿它判字符串相等就行了。

然后经常和二分在一起应该。

二分加哈希可以解决很多东西,比如最长公共前缀之类的。

还有是循环节。

用哈希判断循环节是 \(O(1)\) 的,只需要判断 \([1,n-len]\) 和 \([len+1,n]\) 即可。

循环节的一定是长度的约数所以枚举最少是 \(O(\sqrt n)\)

然后可以通过预处理做到 \(O(n\ln n)\)。

如果需要枚举最小的循环节,可以先预处理出每个数最小的质因子,然后每次除掉这个质因子就行。

每次除掉的东西是循环次数。

代码大概长这样:

while(len>1)
{
	if(equal(l+ans/g[len],r,l,r-ans/g[len]))
		ans/=g[len];
	len/=g[len];
}

数学

我不到咋分类啊。就是联赛知识点前的感觉都是人类智慧

先放个 trick:区间 \((l,r]\) 存在 \(x\) 的倍数当且仅当 \(\lfloor \frac {l}{x}\rfloor<\lfloor \frac {r}{x}\rfloor\)

因为这个 trick 看起来很有用的样子

gcd

我感觉这个是最人类智慧的,啥都能靠上去。

像有的题本来是两元的,然后可以用 gcd 拆成多个一元的函数。然后枚举的时候可以考虑枚举两个数的 gcd 来代替 \(n^2\) 暴力枚举的,我说的就是 [POI2012]ODL-Distance这个题。

质因子(因子)相关

朴素的分解是根号级的,如果是埃筛预处理的话,预处理的复杂度是 \(O(n\ln n )\) 的,而且质因子的个数是 \(O(\ln n)\) 级的。

组合数学

我不会啊

我不到说点啥,因为没见联赛考过很有感觉的题。

卡特兰数

不过卡特兰数还挺重要的吧。

毕竟模型好多好多

通项就是 \(C_{2n}^{n}-C_{2n}^{n-1}\)

像入栈出栈,比如说出栈的次数不能大于入栈,就相当于从 \((0,0)\) 开始走到 \((n,n)\) 不经过角分线

然后还有 +1 和 -1 构成的序列,不能有小于 0 的时候(这个是不是可以由别的什么转化而来....但我忘了)

然后还有就是合法括号序列的种类数,\(n\) 个叶子的二叉树的种数,圆上选 \(2n\) 个点,两两连线,问不相交的方案数。

尤其是入栈出栈和括号序列,感觉很常用

但是还有变形就是转化为不同的问题

就是从 \((0,0)\) 走到 \((n,n)\) 不经过对角线的方案数。从 \((0,0)\) 到 \((n,m)\) 不经过对角线的方案数。

具体的话就是这样:

d3345787e65971c48d81ce45b5f875a8.jpg

我的字好丑www(蓝色和紫色的区别是什么

然后从 \((0,0)\) 到 \((n,m)\) 就推式子就行了(好像是最简单的推式子了

容斥原理

这个应该也很重要的。

在一些问题求所有限制的并集时可以直接使用容斥原理。而如果是一些问题的交集,就是所有减掉所有限制的补集在一起的并集。

在具体问题上也可以体现为减掉不合法的就是答案。

比如 [HAOI2018]硬币购物

直接做是一定会寄。但是我们可以先减掉所有不合法的选法。比如说我们强制某个选了 \(d_i+1\) 个,剩下的价值随便选,然后对这个容斥,得到的就是所有不合法的方案,然后用完全背包的总方案一减,就是合法的方案数。

容斥原理有时候的特点也是会出现很小的标志,并且问的东西往往和子集有关。

挂一个例题 [USACO18DEC]Cowpatibility G尽管我自己是拿bitset乱水的

不知道咋分类的东西

就乱七八糟的就放这就对了

二分

二分的话也是因题而异的吧。然后我经常会想当然地想二分然后想半天发现他没有单调性什么的。然后二分有一些常见的trick 就是总忘

一个trick就是平均数(分数规划)之类的,就像求的式子里可能有两个数相除的形式,就典型的就是子序列最大平均数,就是 \(\frac {\sum a_i}{r-l+1} \geq mid\) 然后把分母乘过去,再减回来,所以就是相当于把每个数都减掉平均数求大于 0 的最大子段和的。

然后也不用是平均数,因为分母可能是别的什么东西,所以就也是乘过去再减掉,然后判断大于 0 就行。

像分数规划的题的话,[HNOI2009]最小圈,是很典型的,[JSOI2016]最佳团体 是树形 dp,不过在此之前需要分数规划一下。

整体二分

许多区间第 k 小什么的就可以用整体二分,动态的也可以把修改套进去。

括号序列

奶一口去年出了今年必不出(((

就是有关括号匹配的问题我联想到了三种情况:

  1. 区间 DP,设对区间是否为合法的括号序列进行转移
  2. DP 中加一维状态,比如到这个位置前面空着的左括号的数量(好像就是特别裸的那种)
  3. 一段啥也没有的序列里的合法括号序列的数量就是卡特兰数

我不到还有啥啊。

有关求最优的序列的

你可以往两个主要方向想:

  1. 固定左端点或右端点,找最优的另外一头。
  2. 分治,对于每个中间点找最优的左端点和右端点。

个人感觉第一种常用一点,

待整理(备忘)

  • rmq 问题(难道不是线段树就足够了吗)

  • 线性数据结构(单调队列,单调栈)

  • 分数规划

  • 卡特兰数和他的各种应用

  • DP 虽然是写得差不多了但是还是要加一些题和 trick 之类的

  • min-max 容斥(首先我要回忆一下我不想写了

  • 前缀和和差分(尤其是差分)的实例

日志&没用的东西

以下内容完全没有用:

关于这篇东西为什么会出现:

暑假的时候看见学长写了一个,感觉好厉害,就照葫芦画瓢写了一个。至于有没有用,我不知道,反正都写出来了。就是到考场上,不管准备成啥样,焦虑不安之类的会充斥着大脑,最后啥都白学......

那些心理素质好的人可能没办法理解吧。

为什么叫仓库:

一开始是叫弹药仓的,因为毕竟是备赛用的,感觉是上战场前的那种后备资源(雾),但是后来觉得叫小仓库更可爱一点?

  • 9.13: 新建 md 文档,添加最短路部分

  • 9.15:添加树上问题相关部分

  • 9.16 : 添加拓扑排序和最小生成树

  • 9.17:kruskal 重构树详细补充了一下,区间 DP

  • 9.18: 考了场初赛,好烦,写了背包的部分

  • 9.19:补上了长链剖分的详细解释,找了两道树形 DP 的题挂在上面,其实用的是以前写的题解

  • 9.20:完善了一下树形 DP,写了一下状压 DP。

  • 9.21:完善一下状压,写了几笔关于概率期望 DP 和数位 DP

  • 9.23:单调队列优化开了个小头,状压加上了枚举子集和超集,好累,睡觉去了

  • 9.25:补完了数位 DP和单调队列优化 dp,dp部分的大框差不多完事了,然写了一下线性数据结构

  • 9.28:我发现我昨天他喵的文件没保存,于是几乎把昨天的重写了一遍,二分,基环树,gcd,也没写啥

  • 10.1:随便加了一点trick

  • 10.7:最近有点松劲的感觉,加了一些trick,线段树部分,图论建图,dp 杂项,整体二分,

  • 10.16:好久没写了,加了数学的一点,然后随便写了写字符串。

  • 11.01: CSP 考完了,寄了,好久没写了,瞎写点东西好睡觉。

    我想倒点垃圾。

    这里本来有一堆垃圾,但是我后来嫌太冗余了就删了(感觉好矫情所以之后也不放出来了)

  • 11.5:随便写写,发表至博客园

标签:仓库,线段,然后,枚举,DP,单调,cc000,就是
From: https://www.cnblogs.com/cc0000/p/16861360.html

相关文章