图论杂题记录

手法/感悟记录,不是题解!!

2025.3.10

CF1264F. Beautiful Fibonacci Problem

这题不是图论,bobo放错了。

结论题,不知道结论就完蛋了。

斐波那契组合恒等式:\(F_{m+n+1}=F_mF_n+F_{m+1}F_{n+1}\)。证明使用数学归纳法,即从最开始的m=0时一定是ok的,然后考虑m+1是否可行。把式子拆开化一化简就出来了。斐波那契数列性质整理

且斐波那契数列模 \(10^k(k\geq 3)\) 的循环节为 \(1.5\times 10^k\),也是一个常用结论。

考虑把这个子串固定在某几位进行构造,发现最后6位是无法构造出所有数字的。考虑在倒数 7至12 位构造。(构造题一定要人为给一点限制的)

剩下的小性质就算知道,场上也做不出来了。。

2025.3.11

CF1239E. Turtle

最大值最小,有点二分的意思 这个n的范围又像搜索/状压

说白了就是首行前缀和和末行后缀和在同一位置处和最大的结果
结果形如:首行单增,尾行单减 只用考虑每个元素的归属也许还有位置关系

还是有点贪心思想的,考虑每次的变化量,得到最值一定在首尾取到
只需要考虑如何把一堆数分成两组,让它们较大的和最小;我们的dp要实现的功能只是划分和检验这个东西最大的能到多少,bitset优化背包dp,数组必须开三维。。

CF521E. Cycling City

路径这样图论的问题,一定要在生成树上做

写了一个巨型分讨并假掉了,突然发现暴力跑环就行了hhh难以绷住

然则又假了,不知道哪里假了,反复修锅,反复出锅,但已经3h+了,我ctj了……(我到现在居然还在for(i)套for(i)。。。中间还调用了i)

启示是输出路径还是最好要回到原树上,这样不容易出错

结果还是不对。。。。又调了很久,写错了一个点,改完之后变量名又没改好,反复趋势。。

总之从上午奋战到现在,已经17:34了。(太失败了

  • 发现我自己想题太慢,而且考场上也是,一想一个思路就陷进去了。还是要多换换思路,看着时间,一般一个思路超过十分钟没有进展,基本上就是废了。所以打算记录每道题的想题时间+写代码时间。

2025.3.12

CF1142E. Pink Floyd

怎么居然是交互题?……我没写过交互啊

start thinking at yesterday 17:38
颓到18:10放学还没认真开始想,感觉废废的,毫无思路

start reading tj at 7:54
finish coding at 9:02

使用的是竞赛图的经典性质:竞赛图经过强连通分量缩点之后一定是从拓扑序小到拓扑序大的一条链

只有一种颜色边的情况不难想,维护两个集合,一个可能成为根,一个不可能。每次把u->v的v放到非根的那里,由于性质,这样做一定不劣。

考虑有粉边的情况。对粉边强连通分量缩点,把所有scc转化成一个DAG,实现上就是用dfs搞出来一个状若拓扑序的东西。每次把粉边的DAG中入度为0的点加到可能根的集合,然后剩下同上。

总结一下,还是心态问题,觉得交互题会很难,然后一定想不出来。其实好好想是ok的。

CF611H. New Year and Forgotten Tree

start thinking at 9:40
start reading tj at 10:43

开始想简单了,想着从下往上构造菊花,遵从的原则是认父不认子,结果发现直接假掉。

想过是不是网络流,发现点数太大。场上可不能对着这种看似简单,实则不可能想到的构造浪费时间。。。

正解很神仙,居然是对每个长度的点设一个关键点,发现最后一定可以构造出来每条边包含一个关键点的树。考虑枚举关键点的树的形态,然后用网络流匹配每种颜色到另一种颜色的点,和它选择的关键点的匹配。在残量网络上输出方案。

还有一种做法是hall定理:对于一个左部点数小于等于右部点数的二分图,存在完美匹配的充要条件是,对于左部点大小为k的任意子集S,这些点在右部连到的点集大小不小于k。每次删边并check即可。

CF1305G. Kuroni and Antihype

start thinking at 15:39
start reading tj at 16:14
Accepted at 17:06(吐槽一下cf上的题跑得也太慢了。。。交一次得等5分钟

与为零会形成一个图,要求一个最大生成树,点权是父亲的价值

我还想了好久,说最大生成树好像这么多边会炸吧,是不是直接贪心。没想到是直接枚举边权和它的子集,看有无符合条件的即可,本质上就是最大生成树。(要考虑到把有向边先转无向边-点权和,再由于与为0和相当于或的性质!

怎么居然没想到既然两个东西是一定在同一张图内能互相选的,那么一次就一定会把它全部选走,一定能构成一棵树的样子!然后把它们再当做一个点继续选就行。细节上因为有枚举子集,所以要卡一下常。

ARC103F. Distance Sums

start thinking at 17:14

能否战胜,在今天之内过掉它

无法战胜,c,!!!老子第二次想到正解,tmd第二次调不过去一点!!!

第二天早上醒来突然想到应该按深度走,这样它整个子树才能被完全严谨计入,否则可能出现某些不完整的子树会直接连掉的情况。

然后又忘记开longlong/判自环,又调了50min,直接失败。。。我已经很久没有因为不开longlong炸的了。。。。。。。

2025.3.13

AGC025E. Walking on a Tree

start thinking at 8:44
reading tj at 9:35
Accepted at 11:21

看不懂题面,什么玩意翻译。。。我以后直接看英文版好了

直接想删掉只经过一次的边是假的,因为如果一条路径,两侧有和它重叠的路径,中间是单独一条路径,这样定向可能会前后不一致,所以一定要考虑加边补成偶度数。

直接跑欧拉回路对吗?对的,欧拉回路是套圈法实现,要当前弧优化,O(m)。这里只是用欧拉回路来确定边的方向,计算答案还得树上差分。

又是一次,明明要加边,数组还不知道开二倍!!反复怀疑我欧拉回路写假了。。(最近这个无效调试太多了。。一定要注意细节,避免这些问题!!!!

AGC033F. Adding Edges

start thinking at 11:25
reading tj at 14:25
Accepted at 16:07

神仙题,无法战胜。只想到暴力加边的复杂度正确(过于显然。。)

巧妙地把经过路径的顺序固定下来,这样方便我们枚举。考虑依次经过A,B,C,如果有(A,B),(A,C)在边集中,此时对于我们进行后续的加边操作,实际上等价于(A,B),(B,C)在边集中的情况。

考虑对于每个点为根,我们直接自上而下地考虑从根节点到每个节点的路径就行。f[x][y]表示以x为根,y上面首个有连到x的边的节点;又,如果添加一条(x,y)的边,那么实际上x会被哪个节点替代。

直接这样做最后就能统计的原因在于:我们随便选某个点为根,那么从它往下,相当于被我们划分成一小段一小段的,根据题目要求,从根连到这个小段的末尾的这条边一定是ok的。最后要除以2,每条路径会被记两次。

CF1264E. Beautiful League / [WC2007] 剪刀石头布

start thinking at 16:17
start coding at 17:01

连边出来是一个竞赛图,我现在见过竞赛图的题几乎都是缩点,但缩完点之后根本不能找三元环了!!还要构造方案。。(还是见识过于短浅了

实在不行,看了一眼tj。不知道我在想什么,三元环这种东西怎么可能直接找。。必须转化啊,正难则反啊!!!转化成三元组数-无法构成三元环的三元组数。发现无法构成三元环的三元组,必有两条边的起点相同。那么后面那个东西就是 \(\sum_{x=1}^n\binom{deg[x]}{2}\),把式子写出来,发现因为有确定的边,所以不能简单拿数学方法求它的min。

但点很少啊!把组合数拆开(经典手法),发现就是 \(\frac{deg(deg-1)}{2}=0+1+2+...+(deg-1)\),然后按着连边费用流就行。

代码真的很简单。。。(人类总是无法摆脱对“我是智障”的认同感

CF1338E. JYPnation

start thinking at 17:49
难以战胜,笔者要滚回去考月考了。。。

2025.3.15

笔者回来了。接上。

不是脑子可能是真的没了。竞赛图先缩点,如果不在一个scc中,贡献就是1+614n,考虑在一个scc的,必然有某个方向的贡献是1。

考虑另一种方向,就是根据我们题目给的条件,推出有一个引理是最短路长度不超过3!!画个图就出来了。所以相当于我们只需要考虑最短路贡献是2或者3,我们统计2的答案。

考虑一个竞赛图的scc必然存在三元环,那么由于题目性质,将会被缩点成前面一堆单点,后面只有一个siz可能比一大的scc。考虑最短路为2的,存在 u->a,a->v,且 v->u。考虑u连出去的拓扑序最大的一个点,只需要判断这个点是否形成了二元路径就行了!

我居然因为用string读入给tle了。。我以后一定老老实实getchar

启示是,如果题目条件太迷,先别急着直接用,先从整体考虑做法,也许推进到某一步才是要用这个性质的时候!!还有遇到这种计数问题,一定要人为规定一些限制条件/转移顺序等,才能方便统计。

UOJ670. 获奖名单

注意到没有重复元素的时候我们直接连边构造就行。有重复元素让我们难以连边。

很好的一个想法是,我们先发现,似乎没有什么“策略”可言,考虑“算法构造”。而图论的算法构造就2-sat,查分约束,欧拉回路。考虑欧拉回路。

发现仍然是直接连边,把所有的单点连一个虚点,跑欧拉回路,剩下单对单双对双就行了。

巨大多细节题,我好久没写过这种题,还是太生疏了。以后不能只看思维了,这码力退化有点严重。

另外,当前弧优化一定要在!vis里面now=nxt[now]这样,否则跑回来还可能往回跳(雾

欧拉回路每次在dfs回溯的时候记录就行了。

2025.3.16

UOJ605. 知识网络

只能想到跑每个点到某种颜色的最短路,然后就考虑这个最短路长度是否要+1就行了。

数据范围看着像bitset。然后就不会了,看tj了。

最好对颜色建立虚点,后面考虑建立最短路DAG,此时我们只能用bitset硬跑最短路了。要用科技“不定长bitset”,变成 \(O(\frac{n^2}{\omega})\),用ull压一下位。实际上就相当于,在最短路图上分组跑bitset,每次一组一组统计,每个点到某种颜色的某个点的距离。

注意要用__builtin_popcountll(),注意这个"ll"

UOJ32. 跳蚤公路

强连通分量缩点,解不等式组吧,然后一个一个传递?这时间复杂度有点假?问题:对于一个强连通分量,必须列出所有环的方程,才能严谨解出范围??

好的,只需要列所有简单环,这是比较显然的,但简单环也很多,还是得dp。

考虑SPFA或Bellman-Ford找负权环,二者没有本质区别。我们考虑对本来找负环的这个dp进行一个扩展。原来找负环是看第n次更新,有没有到一点的路径变得更短了。而现在,对于每条路径,我们写成 \(kx+b\) 的形式,且 \(k\in[-n,n]\)。设 f[i][u][k] 表示从1到u走最多i步,路径长 kx+b 中 b 的最小值。\(O(n^2m)\) 居然能过。

学到了这个找负权环的方法,包括dp的思想。后面取交集还是取并集的问题,要好好想。

UOJ552. 同构判定鸭

感觉DAG是可做的,对于非DAG是否要缩点?

很好,DAG的做法必须要用hash,路径数显然是爆炸的。。。然而我并不会高端哈希的套路,积累一些吧。正解可以通过某些手法证明答案上界不超过n1+n2,然后好像是直接暴力check就行。

这个哈希的套路居然是计算路径上东西的乘积,这样子就必须把每个len都check一下才能严谨。然后后面为了比较是多少位不同了,要算出以每个点结尾的长度为某个数的串的个数,乘上哈希值比较,如果不一样,就是后面哈希的问题。

注意:乘积哈希不能自然溢出!!必须大质数取模!!!因为如果有64个2,他就会直接成0,这样后面就全0了

2025.3.17

UOJ461. 新年的Dog划分

交互题,开始完全没搞懂题目给的已知信息。还是得好好读题,另外,函数交互还是直接复制到一份代码里编译就好了。

考虑对二分图跑一个生成树,这样我们就可以用染色法找到两个集合了。生成树就是考虑如果断一条边能把图断开,那这个就是树边;否则把这个边加到删边集合中。用对点二分优化就行。然后判断是否为二分图就是看奇环,如果只保留树边,和同一集合内的边(就是我们想找的东西),看每次删一条树边,如果仍联通,则非二分图。

注意卡一下交互次数

posted @ 2025-03-15 10:23  theWeeds'Defense  阅读(115)  评论(0)    收藏  举报