有趣题目和认知合集(持续更新)

写写对一些算法的理解,挂几个有意思的题,可能也会挂几个板子题
算法理解偏向于能懂即可,没有严格的证明

快乐几何

[1.2]Volatile Kite 点到直线

快乐搜与暴力

[2.4]Short Code
[2.4]D. Police Stations
[2.5]F. Two Pizzas
[2.5]Tree and Permutation n个点全排列,每个排列A有一个贡献,为 A 1 到 A 2 的 路 径 价 值 + A 2 到 A 3 的 路 径 价 值 + . . . A_1到A_2的路径价值+A_2到A_3的路径价值+... A1A2+A2A3+...
[2.5]E. Pursuit For Artifacts
[2.7]K TV Show Game
[2.9]E. Broken Tree
[3.6]J Starwars

不快乐数论

矩阵快速幂

本质上是计算矩阵的次幂,由于发现矩阵的乘法可以实现式子的递推,所以矩阵快速幂可以实现式子的转移,甚至是图上的转移
[2.7]E. Product Oriented Recurrence
[3.0]bzoj2973石头游戏

各种欧拉

[2.0]E. The Holmes Children
[3.0]E. Vulnerable Kerbals奇怪的数学构造

康拓展开

算某个排列是第几大(从0开始),或者算第x大的是谁,反着做就是逆康拓展开
x = a 1 ( n − 1 ) ! + a 2 ( n − 2 ) ! + . . . + a n 0 ! x=a_1(n-1)!+a_2(n-2)!+...+a_n0! x=a1(n1)!+a2(n2)!+...+an0!
这个只能做到 n l o g n nlogn nlogn
[1.0]康托展开板子

博弈:

很有意思的一类题目,做法基本上就是打表找规律或者用DP或dfs或找规律来搞sg函数,不过sg函数有时候有效值仅为0,1,这样的原因是从必败态走出来的必定是必胜态了,那么似乎只要判断转移的情况有没有必败就行了,sg函数在哪里有用呢?就是Nim博弈的推广,转移出多个状态时,结果和多个堆的值的异或值有关
sg[0]=0时表示先手必败
其实算sg[x]其实是一个dp的过程,枚举每个转移的sg值,然后寻找mex,就是sg[x]的值了。
同时进行多个游戏,则结果是各个sg的异或值
[2.2]C. Berzerk

BSGS

用来算高次剩余 a x ≡ b ( m o d p ) a^x\equiv b\pmod p axb(modp),当a,p互质的时候,可以在模意义下使用乘除,所以 a i ∗ x − j ≡ b ( m o d p ) a^{i*\sqrt{x}-j}\equiv b\pmod p aix jb(modp),也就是 a i ∗ x ≡ b ∗ a j ( m o d p ) a^{i*\sqrt{x}}\equiv b*a^j\pmod p aix baj(modp),这样提前枚举 b ∗ a j b*a^j baj,利用map记录,然后再枚举i,计算是否存在等于的情况,复杂度 O ( p ) O(\sqrt{p}) O(p )
[1.1][SDOI2011]计算器
当a,p不互质的时候,不能直接使用乘除。那么首先可以将等式变成 a x + k p = b a^{x}+kp=b ax+kp=b,为了能够使用乘除,我们可以不停对 a , p a,p a,p取gcd,让等式去除,也就是 a c d ∗ a x − c + k ∗ p d = b d \frac{a^c}{d}*a^{x-c}+k*{\frac{p}{d}}=\frac{b}{d} dacaxc+kdp=db,如果b不能整除d,就无解。这样这个等式在模 p d \frac{p}{d} dp的情况下成立,同时a与p互质,也就是说等式便成了 a c d a x − c ≡ b d ( m o d p d ) \frac{a_c}{d}a^{x-c}\equiv \frac{b}{d}\pmod{\frac{p}{d}} dacaxcdb(moddp),这个和原版的bsgs没有差别了,剩下就是一样的步骤了
[1.0]Power Modulo Inverted

01分数规划

其实这个和数学也没啥关系,暂时放这里了
这个写挺好
简单复读下
首先求的是这样的一个问题,和01背包有点类似,但是是这样的,一些物品,每个物品有一个价值 a i a_i ai一个代价 b i b_i bi,选择了一个物品就会得到价值失去代价,最后要选出一些物品,使得 选 择 物 品 的 价 值 选 择 物 品 的 代 价 \frac{选择物品的价值}{选择物品的代价} 最大

假设,最优的选择用 x x x数组表示, x i x_i xi为0表示每选,为1表示选了,那么答案可以表示为 ∑ a i x i ∑ b i x i \frac{\sum a_i x_i}{\sum b_i x_i} bixiaixi,设值为R
f ( L ) = ∑ a i x i ∑ b i x i f(L)=\frac{\sum a_i x_i}{\sum b_i x_i} f(L)=bixiaixi,那么 ∑ a i x i − L ∑ b i x i = ∑ ( a i − L b i ) x i {\sum a_i x_i}-L{\sum b_i x_i}={\sum (a_i -Lb_i)x_i} aixiLbixi=(aiLbi)xi,我们二分这个L,如果总值大于0,则 ∑ a i x i ∑ b i x i > L \frac{\sum a_i x_i}{\sum b_i x_i}>L bixiaixi>L,意味着有更优的值,然后就这样二分就行了

乱搞:

()E. Timofey and remoduling

莫比乌斯函数和莫比乌斯反演:

μ ( 1 ) { 1 , x = 1 0 , x 的 某 个 质 因 子 次 幂 大 于 等 于 2 1 , 次 幂 和 为 奇 数 − 1 , 次 幂 和 为 偶 数 \mu(1)\begin{cases}1,x=1\\0,x的某个质因子次幂大于等于2\\1,次幂和为奇数\\-1,次幂和为偶数\end{cases} μ(1)1,x=10,x21,1,
这就是莫比乌斯函数,偶尔容斥的时候能够用到bzoj2440
QQQ的ppt
反演就的作用,主要是在难以直接求出的时候,使用反演得到一个便于求解的类似前缀形式,就是利用倍数什么的来求,同时在变换中会出现换常量,很容易出现利用除法来加速

分治

快乐码农

线段树

[2.1]E. Sasha and Array矩阵快速幂+线段树
[2.8]Dirt Ratio二分+线段树
[2.9]E. Serge and Dining Room
[3.0]D. Legacy线段树优化建图
[3.1]E. Memory and Casinos 每个点有个胜率,赢了前进,输了后退,有修改有询问,问从l开始,赢出r的概率
[3.1]E. Nikita and stack
[3.3]Alyona and towers
[3.5]F. Souvenirs 线段树主席树(回滚)莫队都能写

主席树

带有各个阶段的线段树的一种数据结构,原理是,当线段树从最左开始建树,到达第i个的时候,和第i-1个其实只相差了logn个点,那么动态开点,就能在 n l o g n nlogn nlogn的空间建出主席树了
但是其实主席树建立的方式非常灵活,因为本身就是由线段树转换来的,所以其实各种乱搞,例如可以倒着插入来使得可以正着向后推,例如可以维护区间某个值出现最右的值(这两种情况下主席树就不用root[r]-root[l-1]了)
[2.4]E. Till I Collapse可类似分治乱搞
[2.6][TJOI2018]xor树上可持久化tire
[2.7][Scoi2016]美味和异或最大值,很有意思
[2.7] [NOI2010]超级钢琴长度为[L,R]的区间和的前k大,有点意思
[2.8]E. Sign on Fence区间合并+按大小插入
[3.0][BZOJ5361]]如何寻找L,R中出现偶数次最小的数,做法是随机一个ull的数,然后用主席树维护异或值(同理的题目#192. 【UR #14】最强跳蚤)

转转乐

能不写splay就尽量别写,因为一方面难写容易错,一方面常数大容易被卡。
set、与线段树、treap能在很多情况代替splay
首先,splay只能的关键值只能维护一个,所以无法同时维护下标和权值,这就导致splay很多情况无可奈何。
本质上就是通过splay操作来保证复杂度的二叉树,理解下会发现常数极大。
[3.2][APIO2015]八邻旁之桥可线段树可splay,都不是很好写

码码乐

树图一家亲

最短路

dijkstra:无法处理负边,做法是选一个起点,然后不断选出距离最小的更新其他点,因为距离最小的点无法由其他点更新到
folyd:k一定要放在最外层,这个相当于dp,但是状态表示的的是,经过前k个点,能经历的最短路,能够用于传递闭包
SPFA:一个点的答案发生了更新,就意味着这个点延伸出的点可能更新答案
[1.6]Sorting It All Out //闭包
[2.3]Telephone Lines
[2.6]Drivers Dissatisfaction
[2.7]Meeting类似线段树优化建图那样建图
[3.2]Lazy Running神奇的最短路

DSU

[2.3]The Door Problem
[2.8]Phone Call莫名其妙写不对

我最喜欢的环节

[2.3]Matching In Multiplication

SCC DCC

(割点桥均为无向图)
割点:删去节点x以及x关联的边后,原联通图分裂成两个或两个以上的子图
桥:删去边e以后,原联通图分裂城两个不相连子图
求法就是dfs一次,新开一个low数组,low数组会因为回溯而更新自己的值
桥:dfn[x]<low[y] 割点:dfn[x]<=low[y],对于起始点要两个

e-DCC无桥,同理。求法:不加桥地建图即可
求法就是删去所有桥,缩点就重新建图就行
v-DCC无割点,意思就是两个点至少有两条路径到达
求法就是利用栈去求,因为点不能被割开,所以一个点可能会属于很多点,缩点后形成p+t个点的树(森林),p为点双联通分量,t为割点数量

SCC:对于有向图,任意两点能互相到达,则为强联通。求法与DCC相似,都是用dfn与low来判断状态,同时用栈维护元素

能DFS解决就别缩点!!!

[2.0]E. Pursuit For Artifacts
[2.1]Network
[2.2]Knights of the Round Table
[2.4]Intelligence SystemSCC+简化朱刘
[2.4]F. Tourist Reform
[2.6]The war数据不保证图联通
[2.7]Railway 有点奇怪的点双,点双中判桥
[3.0]FantasiaSCC+乱搞

欧拉路

存在欧拉路:恰好两个点度数奇数,其他均为偶数
欧拉图:无向图联通且度数均为偶数
输出路径是利用栈来模拟这个过程,同时标记跑过的边一边跑一边存储答案

2-SAT

解决的问题:一堆点,每个点有两种状态,0或1,有一堆条件,可抽象为:若i为x,则j为y,(x,y为0,1)求是否存在一种合法赋值满足所有条件
该问题可以开2n个点,前n个表示取0时候的情况,后n个表示1的情况。对于每个条件,可以建立一对有向边。如若i为0,则j为0,那么可以建一条从i到j的边,同时根据逆否命题,可以建立j+n到i+n的边。那么如果2-SAT存在解,则该图求出强联通时,任意i与i+n不在一个强联通中。同时,一个强联通中的点都处于同一种状态。
求一个2-sat的可行解,相当于在这个图中取出一个子图,使得i与i+n恰好有一个被选中,且被选中的点的所有出边指向的点也都被选中。如果在强联通中选择一个点,则会使得很多点也同时被选中,这样可能产生冲突。所以可以建立反边,跟拓扑排序一样选点,如果这个点没有选过,就选择这个点,否则就不选。这么做是因为建立反边以后,入度为0的点意味值不会跟已选择的任何点冲突,也就是说不会产生任何错误。

二分图

点可以划分为两个集合,同一集合内的点没有连线,就是二分图
判定:暴力染色判有没有长度为奇数的环
最大匹配:任意两边没有公共端点为匹配,边数最多为最大匹配
匈牙利算法:寻找增广路,就是从一个点出发,发现一条路径,也就是路径上的边满足:沒选,选了,沒选…沒选,选了。那么将这条路径上的边取反,就能多一条边(原来匹配的点还是匹配的,多了俩个以前没有被匹配的点)。每次从左集合的一个点出发来寻找增广路,找到了就能加一条边,
复杂度 O ( n m ) O(nm) O(nm)
完备匹配,左右集合点数均为n个点,最大匹配n条边
多重匹配,每个点可以连多条边,解法:拆点,每个点多遍历几次,网络流
带权最大匹配,每条边一个权值,求一个最大匹配,使得匹配边权值和最大,前提是匹配数最大。
KM算法,只能当“带权最大匹配一定是完备匹配”才能用。做法就是将左边右边的点都赋一个值,假设为 a i a_i ai, b j b_j bj,满足 a i + b j ≥ w ( i , j ) a_i+b_j \geq w(i,j) ai+bjw(i,j)
相等子图,二分图所有节点和满足 a i + b j = w ( i , j ) a_i+b_j=w(i,j) ai+bj=w(i,j)构成的子图为二分图的相等子图
若相等子图有完备匹配,则这个完备匹配就是原二分图的带权最大匹配
KM算法核心就是,利用贪心思想,一点一点加边。一开始将 a i a_i ai赋值为 max ⁡ j = 1 n w ( i , j ) \max\limits_{j=1}^{n}w_(i,j) j=1maxnw(i,j) b j b_j bj为0。只有当 a i + b j = w ( i , j ) a_i+b_j=w(i,j) ai+bj=w(i,j)才选中这个边,那么一开始每个点选的都是最大的边,当发生冲突时,我们让每个搜到的边(包括匹配的和沒匹配的,其实就是搜索树中的)减去 min ⁡ a i + b j − w ( i , j \min{a_i+b_j-w(i,j} minai+bjw(i,j,这样我们每次贪心都能保证是将尽可能大的边放入,其他的就和km算法思路相同,不停取反即可。
为什么只能解决完备匹配呢?因为这个算法本质上是个贪心,而这个贪心是基于每个点最终都有一个边与它相连

不会建图(网络流)

核心是建立反边,正是因为反边,所以才能保证正确性
最大流:
EK:每次寻找一条增广路,然后更新,复杂度 O ( n m 2 ) O(nm^2) O(nm2)
DINIC:EK每次只找一条增广路,有优化空间,DINIC每次先在图上BFS,给每个点打一个步数标记,然后在残余网络中DFS,复杂度 O ( n 2 m ) O(n^2m) O(n2m),虽然不会证明,但是感觉上和实际上都是DINIC更难达到上限,甚至 1 0 5 10^5 105的图都能跑(DINIC跑二分图最大匹配复杂度是 O m n Om\sqrt{n} Omn
ISAP是DINIC的进一步优化,也不长,推荐使用
HLPP:最快的写法
费用流:
EK:将dfs寻找增广路改为spfa寻找增广路(寻找单位费用和最小的路),因为有负权边,所以是spfa

如果存在拆点,可以多跑几次来代替拆点,因为拆点会导致点的个数成倍增长,因为网络流复杂度是 O ( n 2 m ) O(n^2m) O(n2m)导致拆点增加的复杂度是成倍增加的

如果最小割要输出方案,那么只需要利用d数组就能输出方案,因为d[i]!=0证明i点属于s的点集中,那么只要一条边一端d[i]!=0另一端d[i]==0即可,而最大权闭合子图中,只要d[i]!=0就是在一端中
最大流输出方案还是按照e[i].c ==0来判断的
更新 其实上面对于割集的构造方法,主要利用了最后一次bfs后,图无法联通所构建的,而这样一端能到达,一端无法到达的边组成的集合一定是一个最小割。
可是如果有时候需要构建最小字典序的最小割,就不能这样了,事实上,在跑完网络流后,一条边的两端无法到达,就也可以成为最小割边集中的边。那么选择完这条边,剩下的可以手动将边变回原流量(除了选择过的边),然后继续跑网络流即可。

对于无向图跑网络流,可以add(a,b,c) , add(b,a,c)也就是正反都建立一次,虽然表面上看起来流量变成了2*c,但实际上由于是正反的关系,所以也是有抵消的效果,所以这么建是正确的

[1.3]Minimum Cost拆点复杂度
[2.1][CQOI2009]跳舞拆点是常见的操作
[2.1][HNOI2007]紧急疏散EVACUATE套路套路
[2.4]Marriage Match IV计算完全没有交集的最短路个数
[2.5][CQOI2012]交换棋子
[2.6]happiness 最小割的套路
[2.6]圈地计划和上面哪个题一样
[2.7]Tachibana Kanade And Dream City网络流总能和floyd产生交错
[2.7][CQOI2014]危桥网络流总是能给人惊喜
[3.0]Give out candies不等式类建图+取反值求最小割
[3.2]「雅礼集训 2017 Day8」价神奇的最大权闭合子图转换+一些限定
[3.3][CTSC2008]祭祀 Dilworth 定理:最小链覆盖数 = 最长反链长度,第二问的构造不太会,第三问很有意思

上下界网络流

就是每条边有一个下界一个上界,只有每条边都满足这个要求,且每个点出入流相等,满足这样条件的就是可行流。

无源汇判断有无可行流,我们把每个点进入的流的和-出去的流的和,即 ∑ u ∈ V c ( u , i ) − ∑ v ∈ V c ( i , v ) \sum\limits_{u\in V}c(u,i)-\sum\limits_{v\in V}c(i,v) uVc(u,i)vVc(i,v),然后建立额外源点 s s s汇点 t t t,如果这个值大于0,那么我们连接 s s s和i,流量为差值,否则则连接 i i i t t t,流量为差值的相反数。然后跑一个最大流,如果最大流等于s的出边的流量之和,就是有可行流。
为什么这么建图?这么建边的实际意义就是所有边一起消除下界,但是如果入的多,我们就利用源点来跑网络流,用消去下界的边去抵消掉这额外的入流,同理,出的多,也是利用消去下界的边消去额外的出流。也就是说,跑完这个网络流后,原图的边可能流量已经发生了变化,用作抵消下界了。

有源汇判断有无可行流,将S到T连接一条无限流量的边,其他完全一样。
为什么这么建图?有源汇相较于无源汇。唯一的区别就是源点出流无限,入点入流无限,那么我们将T到S连一条边,整个图就变成了之前的问题,那么接下来一样就理所当然了。
上面求出的流量只是可行流,不一定是最大也不一定是最小,且流量为T到S的反向流,也很好理解,因为本来S,T是源汇点

有源汇最大流,先和上面一样建图,先判断是否有可行流。然后用S和T再跑一次最大流,答案就是这个最大流。还有一种写法是判断有可行流后,统计流量,拆掉S,T后加的边,然后跑最大流,答案为两个流量之和。
为什么答案是这样?因为之前的为了消除下界,已经消耗了一些流量,这些流量也是需要统计进答案的,而T到S的反边恰好就帮我们完成了这个统计,所以再跑一次最大流就是答案。删边再跑其实原理一样,只不过分开做了而已。

有源汇最小流,和有源汇判断有无可行流一样建图,然后跑最大流,然后连T到S的边,流量inf,然后跑最大流,如果两次流量和不等于额外源点的出流和,则无可行流,否则答案则为T到S的反边
为什么答案是这样?这个思路和之前不一样的地方在于,我们优先使用里面的边的流量,最后再由源汇点提供额外的流量,这样就保证了尽可能的小

和最大流比较的话,就是一个优先利用自己源汇的,一个优先利用其他边的

有源汇费用流,首先建立额外源点汇点,对于原图中的边x->y,若限制为[b,c],费用为cost,那么连边x->y,流量为c-b,费用为cost,其余和之前相同,费用为0,然后跑费用流即可,答案为费用流跑出的结果+原图每个边的下界 ∗ * 费用
为什么答案是这样?保证了可行流的情况下跑费用流
注意:有上下界的费用流指的是在满足流量限制条件和流量平衡条件的情况下满足流量限制条件和流量平衡条件的情况下的最小费用流 ,而不是而不是在满足流量限制条件和流量平衡条件并且满足最大流最大流的情况下的最小费用流

[1.0]194. Reactor Cooling无源汇可行流板子
[1.0]176. Flow construction有源汇最小流板子
[1.0]有源汇有上下界最小流有源汇有上下界最小流板子
[1.0]有源汇有上下界最大流有源汇有上下界最大流板子
[1.3] [AHOI2014/JSOI2014]支线剧情上下界费用流
[1.3]士兵占领 有源汇最小流,也可以最大流写
[1.3]Shoot the Bullet 有源汇上下界最大流
[1.4]80人环游世界再次感受神奇的上下界费用流
[1.6] FJ2014集训 XWW的难题 很套路的上下界费用流
[2.0]清理雪道手动加源汇的最小流,最少几条路径覆盖所有边

最小割树

定义一棵树T为最小割树,如果对于树上的所有边(s,t),树上去掉(s,t)后产生的两个集合恰好是原图上(s,t)的最小割把原图分成的两个集合,且边(u,v)的权值等于原图上(u,v)的最小割
原图上u,v两点最小割就是最小割树上u到v的路径上权值最小的边
建立最小割树的常用算法就是Gomory-Hu Tree
简单来说就是不停的跑最大流,每次割边会让点集分成两个,跑得时候让所有边回到最初状态
由于每次都是暴力,所以复杂度 O ( n 3 m ) O(n^3m) O(n3m),不过一般达不到上限
[1.0]模板】最小割树
[1.0][ZJOI2011]最小割
[1.0] [CQOI2016]不同的最小割

支配树

一个图,规定一个起点,对于点w,如果删去点v,使得起点无法到达w,则称v支配w。每个点都求出一个最近支配点,把这个点当作自己的父节点,形成一颗树,称为支配树。
能解决的问题:求某个点到其他点的必经点集
构造方法:
对于一颗树,显然就是支配树
对于DAG:因为无环,所以很好求支配树。首先拓扑排序,对于一个点,找出所有入边所连接的点的lca,这个点就是它的支配点,复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
对于非DAG:有了环,就无法根据这个来判断了。首先定义一个半支配点,当x能够到达y,且路径上所有的点的dfs序均大于y的dfs序,则最小的x就是y的半支配点。
这个半支配点是用来寻找真正的最近支配点所用的,很容易发现,一个点的最近支配点就是自身的半支配点或者是祖先的半支配点。也就是说:半支配点是有成为支配点可能的点。
然后就是利用半支配点求支配点了。这个有很多证明。不过证明这东西,只是证明了这个是对的,却不会告诉你为啥要这么想。到头来看了半天证明发现还是套板子就行了。
顺便一提,割点与是否支配无关系,是割点也可能无法支配某个点。
支配树点个数不一定是n个
[1.2]CodeChef - GRAPHCNT
[2.3]F. Team Rocket Rises Again

树上差分

正常差分是正着写,树上正着写会导致多余的点也被染色,所以可以反向染色,这样回溯的时候再把值加上即可
[1.8]Alyona and a tree

dsu on tree(启发式合并)

需离线,处理子树问题,通过轻重链剖分来稳定复杂度的暴力。
具体操作,首先存下询问,然后预处理出重儿子,然后dfs,dfs时候,先暴力统计轻儿子的答案(轻儿子的东西会被清楚),然后暴力统计重儿子的答案(重儿子的答案保留),然后再遍历一次轻儿子,然后统计自己的答案,然后根据自己是轻儿子还是重儿子来决定要不要清空自己

[1.2]E. Blood Cousins 森林中求某个点深度为x的孩子个数
[1.2]F - Dominant Indices子树哪层最多
[2.2]D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths 边有字符,树上路径的字符某种排列为回文的串为所求,问子树中最长的这种串
(和E. Palindromes in a Tree好像,不过一个是统计点,一个统计子树。导致一个是点分治一个启发式合并)
[3.4]F. Peterson Polyglot树合并(自带启发式)

树分治

做法就是不断找重心,然后dfs,然后统计答案,然后删去这个点,重复上面过程。
因为是重心,所以保证了复杂度
[1.6]聪聪可可
[2.4]快递员有趣
[2.4]曼哈顿计划ESG
[2.6]E. Digit Tree
[3.0]树上游戏

动态点分治

能够处理的是将某个点x距离y以内的点加减一个值。
其实这个算法不应该叫动态点分治,更应该叫点分树,甚至说跟点分值也没啥关系。因为本质上就是不断求重心来重构树,让每个点的父亲是上一个求出的重心,这样可以保证树的深度。
首先,我们用动态开点线段树,每个点维护自己的子树,维护一个权值线段树,以距离为下标。
虽然重构后的树是完全乱的,但是点与点之间的关系其实是不变的,这样我们利用距离差就能维护的出问题了,但是其实还是有一点问题,就是下面统计过的树会对上面造成影响,这个我们再开一个线段树来维护对上方的影响。
因为每层等于开了一颗线段树,能够发现,它的空间大概是 O ( 2 ∗ 4 ∗ n l o g n ) O(2*4*nlogn) O(24nlogn),也就是至少100多倍,可以说很惊人了
[1.2]震波虽然是板子题,但是不建议写,因为bzoj的老爷机+极小的时限导致必须使用树状数组或者极限卡线段树区间大小才能过
[1.2]烁烁的游戏这个更好的板子题,因为,其实和上面那个题很像,不过这个是区间修改,单点查询

究极传统手艺

[2.7]F. Ehab and the Big Finale树剖核心思想题目
[3.4]睡觉困难综合征或者在bzoj上由乃的OJ 树剖码力测试,我的测试结果不及格,所以写了个题解

乱搞

[2.6]D. Complete Mirror

智商欠费

线性智商欠费

[2.0]1636 教育改革
[3.3]F. Axel and Marston in BitlandDP+倍增
[3.5]E. Exam Cheating状态难想

树形智商欠费

在树形结构上dp,很类似于启发式合并,都是把子树的信息返回给父亲(所以说只是个记忆化搜索),处理方法和树分治很像,处理完一个子树更新一次,或者处理完统一更新(所以能各种乱搞),所以各种智商题(因为主体是dfs,所以很短?)。
树形背包很关键,一定要主要细节,比如哪些才是有效转移
[1.0]Anniversary party 每个点一个权,选了孩子不能选父亲,选了父亲不能选孩子,问最大权值和
[1.2]The more, The Better
[1.4]Tree of Tree 大小为k的子树最大权值和(树上背包)
[1.7]Cell Phone Network 一个点可以保护自己和相邻的点,问做少需要几个这样的点
[2.0]Tree直径有几条(尝试用 O ( n ) O(n) O(n)的dp,尽可能短地完成)
[2.1]Y树中三点不在一条路上的方案树
[2.2]The Ghost Blows Light 走边要时间,走点能拿宝藏,问1到n在T时间内最多多少宝藏
[2.2]E. Mahmoud and a xor trip
[2.3]Starship Troopers一个房间一个价值和话费,走过的路不能再走(本质不难,但是有坑,可能会带来启发,即把花费为0的叶子变为1,且注意花费和最大花费的关系)
[2.4]Tree2cycle 把树变成环,最少删除和添加几条边
[2.5]GeoDefense每个点可以建炮台,有造价和伤害,给你一些钱,让从1出发到达每个叶子的最小值最大(树上背包)
[2.7]Find Metal Mineral 给一棵树,每条边都有一个花费. 有k个机器人从S点出发, 问让机器人遍历所有边的最少花费值(树上背包)
[3.1]Ostap and Tree

概率智商欠费

[1.7]Jon and Orbs

单调队列优化智商欠费:

将策略有单调性的放到单调队列来优化(这里其实就从前向后扫决策时,如果后方决策更优,则代表之前的决策可以删掉,因为后方的决策不仅更优,还能存活更久)。
用的其实是双端队列,尾部控制单调性,头部控制合法,将 n 2 n^2 n2优化为n
具体操作方法:
先从尾部删不如当前决策优的,然后头部删非法的,操作完队头就是当前最优的
[1.9]Fence

乱搞智商欠费:

写一些用乱七八糟的方法写的DP
[2.7]Financiers Game (DFS+DP)

状压智商欠费:

[2.7]Vladik and cards
[2.8]E. Hongcow Buys a Deck of Cards

乱搞

[1.2]Molly’s Chemicals多少个区间和为 k x k^x kx
[1.3]Jon Snow and his Favourite Number
[]D. Timofey and rectangles
[]F. Music in Car
[2.2]Santa Claus and Tangerines
[2.3]E. Dasha and cyclic table(bitset)
[2.5]Sleep in Class(有点麻烦的队列模拟)
[2.5]Logical Chain神奇的bitset

期望与计数

[2.4]D. Bear and Tree Jumps树上期望
[2.7]F. Igor and Interesting Numbers
[2.9]F. Geometrical Progression(等比数列个数)
[3.1]E. Inversions After Shuffle
[3.2]F. Bacterial Melee
[3.3]F. Dasha and Photos(算最小矩阵距离)

构造

[2.3]D. Ehab and the Expected XOR Problem

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值