省选集训-图论杂题
省选集训-图论杂题
CF888G
到现在已经是典中典了。
考虑 boruvka 算法,根据异或性质,事实上 Trie 树也可以叫做一类 boruvka 异或最小生成树树。
所以在Trie上分治做,每遇到一个分叉点就说明有权值,将左边的拿出来查右边取最值即可。
P8260
嗯,史中史。
是这样的,首先读错了一个小时题。
注意到有如下情况:\((x_i,x_j),(y_i,y_j)\) 无祖孙关系时,是四个 \(siz\) 加起来,有一对有祖孙关系时候其相应的较小的 \(siz\) 就会减掉。
完全图最小生成树显然考虑 boruvka 算法,维护最优值与与其不同色的次优者即可。
那么就有几种情况:
-
无祖孙关系
可以直接 \(O(n)\) 计算每个 \(siz_{x_i}+siz_{y_i}\),由最优性即使存在祖孙关系也会被更新
-
有且只有一对祖孙关系
这里包含了四个情况其实。
但是当前是 \(x/y\) 作为祖/孙的情况是可以全部压在一个 \(dfs\) 里计算的——子树回溯的值解决是祖先的情况,而自顶向下传入是后代的情况。
-
祖-孙—祖-孙关系
考虑以 \(x\) 统计,也就是利用 dfs 序,线段树合并,单点修改,区间查询最值。
-
孙-祖—孙-祖关系
考虑以 \(x\) 统计,也就是开可持久化线段树自顶向下传,可持久化线段树加入值的时候变成标记永久化区间修改,单点查询即可。
-
孙-祖—祖-孙关系
考虑另一个情况可以通过交换 \(x,y\) 做到。
这里就是自顶向下可持久化线段树单点修改区间查询了。
写起来史诗级的史。
QOJ9904
考虑 Kruskal,将 \(a\) 排序之后,其实每次是相当于给出一个对称轴,对称的两个位置连通块不同就合并。
由于只会合并 \(n-1\) 次,我们不妨每次从对称轴出发二分首次不对称的位置,这里需要判断对称,使用线段树维护回文串哈希即可。
复杂度 \(O(n\log ^2n)\)。
CF827F
很强的问题。
首先考虑我们首次到达一个位置后能够做什么,走某条边,或者等待某条边的出现。
等待出现这个过程需要一个辅助边,并且周期为 \(2\)。
这启发我们将时间按照奇偶分类讨论,那么不妨将点拆为奇点和偶点,那么边就会变成四条有向边。
这样的话,我们统一奇偶性后,一个状态就可以被描述为 \((u,l,r):\) 在 \(l\) 时刻到达 \(u\) 且最多停留至 \(r\) 时刻,中间所有奇偶性相同的时刻都可以出现。
那么对于一个 \(u\),其所有有效状态的 \((l,r)\) 是不重叠的,且在优先队列里是按顺序取出的,且我拿到 \((l,r)\) 之后,我可以遍历出边 \((v,l',r')\),满足 \(l'\le r,r'\ge l\)(这里奇偶性不同所以带等号也没什么)。
注意到这样我们就遍历了所有 \(l'\le r\) 的出边并更新了状态 \((v,\max(l+1,l'),r')\),在后续的 \((u,l'',r'')\) 这样的出边就没用了,因为 \([l'',r'']\) 与 \([l,r]\) 不交,这些边就直接删除了,因此每条边还是只会松弛一次,dijkstra 复杂度不变。
UOJ 32
笑题。
考虑到数据范围偏小,思考如何判断负环。
注意到我们需要记录路径上 \(x\) 的影响系数,所以肯定是要求一个 \(f_{i,j,k}:\) 走了 \(i\) 条边(边数判负环),到达点 \(j\) ,其 \(x\) 影响系数是 \(k\) 的最小值。
那么考虑一个负环是如何诞生的。
考虑 \(1\to t\),在确定 \(x\) 后存在路径有负环,则一定有一个最优的负环满足其上有一点 \(v\),\(\min(kx+f_{n,v,k})<\min(jx+f_{n-1,.v,j})\) ,因为恰好可以多走一圈这个负环。
那么我们可以处理出对于每个 \(f_{n,i,j},f_{n-1,i,j}\) 其对应式子最小值被它自己取到时的 \(x\) 的取值范围。
然后再对于每个点 \(v\),枚举式子两侧最优的 \(k,j\),然后解出满足这个式子的范围,对于所有 \(v\) 可达的点,这个范围的 \(x\) 都是不可取的,除掉。最后判断即可。
gym104076I
我们猜测当 \(x\) 比较大的时候最短路应当是有些规律的,因为你可以在一条边上反复摩擦去更新所有奇偶性相同的更长的路。
因此对于原本所有的 \(1\to n\) 的路径(不一定简单,因为一个长偶数路径可以走),设为 \((w,len,v)\),表示长度为 \(w\),边数为 \(len\),最小边为 \(v\) 路径,会对所有 \(len+2k,k\in Z^+\) 的最短路产生更新 \(w+2kv\)。
在所求路径的 \(len\) 足够大时,可以忽略掉简单路径的 \(len\) 限制,就只需要考虑 \(v\) 了,那么实质上只有 \(O(m)\) 个有效的一次函数。
事实上我认为在 \(len>2n\) 时就行了(你最多是一个简单路径加一个奇环),可以对于所有的 \(v\),求出 \(len=2n,2n-1\) 时的 \(w\) 最小值。
这个可以通过动态规划 \(O(nm)\) 计算。
然后分开奇偶性,就变成 \(O(m)\) 一次函数对于每个位置求值后取最小值的和了。
这个由于一次函数单调性,快一些的可以是求上凸壳 \(O(m\log m)\),也可以直接暴力 \(O(m^2)\) 解方程计算。
P7353
直接交的。
发现Jerry可以在一个点双里一直周旋,只要 \(sz>2\)
所以 Tom 获胜的条件应当是阻止Jerry逃入一个 \(sz>2\) 的点双。
好像不太对,应当是逃入一个 \(sz>2\) 的点双,且这个逃入点与当前Tom位置至少差了一条边
但是Tom 每一次肯定会走在割点上,不然Jerry可以走到整个图任意位置,只要Tom再走一步不会锁死,那就永远不会锁死,这种情况只有走到一条链上,但是这还是相当于Tom下一步走到割点上锁死Jerry
那么Tom 能够走的每个位置就很感人了,如果不考虑复杂度,求出割点后把原图上相连的割点连起来就得到了Tom的行走路
考虑建立圆方树,然后Jerry必败的条件就应当是Tom 到 Jerry 这个方向的子树里的每个割点都可以通过每次走一个割点到达。
也即是说,定义一个节点是好的,当且仅当其往上走的第一个割点与它直接相连
当 Jerry 必败时,当且仅当
- Tom 所在位置是割点
- Tom - Jerry 子树方向上任意一点是好的
需要换根一下求子树外合法的情况
不过在一个菊花的情况,是可能存在一个必胜点的,Tom 走到必胜点后就必胜了需要判掉。
QOJ4892
考虑到要求是固定三个数之间的中位数,因此对于限制 \((i,j,k,x)\) 而言,可以改写为若干限制条件:
- \(a_i<x\implies a_j,a_k\ge x\)
- \(a_i>x\implies a_j,a_k\le x\)
- 轮换
那么这个题就可以改写为 2-SAT 了,可以定义状态 \((i,x)\) 为 \(a_i\ge x\)。
并且对于 \(i\) 它可能取的值除了 \(1,1e9\) 就只有限制中提到的 \(x\),所以总状态数是 \(O(q)\) 的。
那么就 \(O(n+q)\) 解决了。
round 2:难度直线上升。
AGC025E
设 \(c_i\) 为边 \((i,fa_i)\) 被覆盖次数,答案上界是 \(\sum \min(2,c_i)\),我们考虑如何证明这个上界。
考虑限制 \((a,b),(b,c),(a,c)\),从树上路径 \(a\to b\to c\to a\) 的过程就达到了这个上界。
更进一步,发现限制的这些点组成的环在原图上的路径就达上界了。
更好地,我们将所有限制建立一张图,如果这个图可以拆解为若干环,那么就容易了。
这是容易的,如果每个点的度数都是偶数,每个连通块跑欧拉回路即可。
否则考虑将其改造为一个每个连通块都有欧拉回路的图而不影响答案,最直观的是加入树边,将其当作一个限制可以将影响最小化且如果是将奇数度化为偶数度,那么最后欧拉回路的方案也是有原本的 \(\lceil\frac{c}{2}\rceil\) 的均分的,而这个覆盖次数每条边最多增加一,因此答案无影响。
所以再自底向上跑一个 \(dfs\) 决定加入树边的方案即可。
loj 3682
考虑球的运动轨迹,不难想到将一个挡板拆为上下两块,然后按第一次可达点连边,每个点度数最多是 \(2\),因此每个连通块不是环就是链。
根据题面信息,环长是 \(8\) 的倍数才行,而链呢,可以使用超级源点将其串起来作为一个大环。
然后考虑如何构造方案,只需要知道一个挡板两个点颜色相同,任意一个环最终颜色均分四种即可。
那么对于每个环建立一个点,对于一块挡板所在两个环将这两个环代表点连边建立新图(自环也算)。
那么新的问题就是将每个点相连的边染为四种颜色并要求均分。
可以考虑先均分两色,然后对于两个颜色再分别建图,每个点度数是四的倍数,再次分为两色,问题就解决了。
那么问题就简化为了均分两色。
可以想到欧拉回路出入度相同,启发我们使用欧拉回路相关方法。
对于不含自环的图,跑一条欧拉回路,按顺序染黑白色显然是对的,因为除了起始点外都是一个颜色进一次另一个颜色再出去,而起始点是经过了偶数条边回来,颜色也能对上。
考虑到自环在这里的实际意义其实是当两条边再算,如何特殊处理?答案是不需要特殊处理,模拟欧拉回路的染色可以发现,自环个数也会均分,如果一个颜色的自环更多则其对应的边也会少一条平衡。
那么现在就是超级源点怎么搞成八的倍数了,事实上再加入自环让其变成八的倍数即可。
CF1305H
好强的题目
考虑将其看作一个多匹配,不妨设 \(f_i\) 为每道题实际通过的人数,设 \(c_i\) 为排名为 \(i\) 的人的过题数。
使用霍尔定理,考虑一个人的集合 \(S\),有:
当 \(c'=c\) ,且 \(S\) 里的元素是 \(c\) 最大的时限制是最强的,因此我们不妨假定 \(c\) 从大到小排序,可以得到:
因为我们要最大化排第一的人数,因此考虑 \(f\) 确定时,不妨设 \(s_i=\sum_{j=1}^ic_j\),则可以求出 \(s\)。
但是注意到有部分值是确定的,因此 \(s\) 除了受到 \(f\) 的限制之外还会受到已知值的限制。
这样求出每个 \(s\) 的上界,我们就可以二分排第一的最大人数,然后钦定它,接着 check,check 是容易的,我们考虑一个个还原出 \(c\) 即可,每次事实上相当于对当前的 \(c_i\) 提出一个上界限制,并观察已知值(如果有)是否满足这个限制,如果没有已知值就取上界,后面继续判断,这里的合法性在于 \(s\) 对后面存在方案提出了保证。
在这个 check 的过程中可以顺带求出最大的首项值。
那么现在我们就来考虑如何求最优 \(f\),发现这里的要求事实上就是 \(f\) 较小的项尽可能平均(因为check时会用前 \(mid\) 项 \(\min(\frac{s_i}{i})\) 来计算最大值)
做到这一点非常简单,考虑将所有值初始化为 \(l\),每次将未达 \(r\) 的最小值调整到与次小值同大或者顶到上界。
P7307
以前做过。
考虑分治,类似二进制赋颜色,因为是二分图,所以定义将左->右为黑色,另一边为白色,将其代表颜色的值的当前二进制为置为0/1,就可以保证后续互不干扰。
跑欧拉回路分配即可。
P6790
广义串并联图方法:删一度点,缩二度点,叠合重边。
设 \(f_{i},g_i\) 分别为连通/不连通边 \(i\) 所链接两个端点的方案数。
- 删一度点,由于求生成树要求连通,将答案乘上 \(f\)
- 缩二度点,连通的方案就是 \(f_lf_r\),不连通但是注意两边都不能不连通,这样这个点就没了,所以是 \(f_lg_r+f_rg_l\)
- 叠合重边,连通是\(f_0f_1+g_0f_1+g_1f_0\),不连通是 \(g_0g_1\)。
P8426
神题。
结论:添加辅助边 \((1,n,L)\) 后,答案为假当且仅当 \(1,n\) 所在点双用广义串并联方法缩完后就是一条边 \((1,n,L)\)。
先考虑整个图都是点双的情况下,通过广义串并联方法缩完后,如果是一条边,是容易判断的。
如果是多条边,那么每个点度数至少为 \(3\),点数至少为四那么我们拿出四个点 \(1,x,y,n\),根据串并联图性质,有 \(1,x,y,n\) 两两间存在点不交的简单路径,不妨将其记作 \(P(x,y)\),那么 \(P(1,n)=L=P(1,x)+P(x,n)=P(1,y)+P(y,n)=P(1,x)+P(x,y)+P(y,n)=P(1,y)+P(y,x)+P(x,n)\)
所以 \(P(x,n)=P(x,y)+P(y,n),P(y,n)=P(x,n)+P(x,y)\)
所以 \(P(x,n)=P(x,y)+P(x,n)+P(x,y)\implies P(x,y)=0\),显然非法。
因此我们说明了,答案为假当且仅当广义串并联图方法缩完图后有且只有一条边 \((1,n,L)\)。
QOJ4219
还是考虑匹配。
将一对不喂食会打架的蚂蚁连边,那么就变成了二分图最小点覆盖问题,转化后变为二分图最大独立集。
考虑到如果一个黑点在独立集中,则其右上方白点都不在独立集中,一个白点在独立集中,则左下方黑点都不在独立集中。
那么最终方案应当是找一个左上到右下的折线,满足折线上方的黑点在独立集中,折线下方的白点在独立集中。
问题转化为找到这样一条折线,使得上方黑点数加下方白点数最大。
变成最大匹配问题,也就是相当于对于每个黑点,找到其匹配的右上方白点这两其中之一不产生贡献——即这两个点在折线同侧。
这就足够了,贪心地可以求解一组最大匹配方案(将黑点 \(x\) 从大到小扫描并不断将白点加入待选集合,然后取出一个 \(y\) 最接近的白点进行匹配,这样显然正确)
然后就可以构造斜线了,我们强行要求其在折线同侧,也就是按 \(x\) 从小到大扫描,如果发现当前折线位于一对匹配中间,那么立即向下调整。
如何扩展到动态?不难发现随着白点的加入折线只会不断上移,那么对于当前在折线下方的点状态就是固定的了(白点固定产生贡献,黑点固定无贡献),可以直接删去。我们就可以使用整体二分来解决这个问题了。
P9528
考虑使用霍尔定理,事实上还是选出若干段 \([l,r]\) 的蚂蚁,吃掉其周边所有的糖。
所以不妨设 \(a,b\) 分别为蚂蚁和糖的前缀和,不妨以蚂蚁为左部点,方糖为右部点,则所求 \(\max(|S|-|N(S)|)\),设选取区间 \((l,r]\),也就是 \(a_r-a_{l}-(b_{r+L}-b_{l-L})\)
这里如果连续选择的两个 \((l,r]\) 在 \((l-L,r+L]\) 上有交,那么一定不是最优的。
不妨设 \(f_r=a_r-b_{r+L},g_l=b_{l-L}-a_l\),事实上就是交替选择 \(f,g\) 求最大值。
考虑线段树维护 \(dp_{l,r,0/1,0/1}\) 表示第一次和最后一次选择 \(f/g\) 的最优解。
-
增加蚂蚁
相当于 \(f,g\) 在同一段区间做区间加减。
只会对 \((0,0),(1,1)\) 的状态产生影响
-
增加方糖
相当于 \(g\) 在 \([pos+L,\inf]\) 做加减,而 \(f\) 在 \([pos-L,\inf]\) 做加减
注意到中间间隔不超过 \(2L\),那么根据最优性, \([pos-L,pos+L]\) 至多选择一个 \(f\) 和一个 \(g\),也是容易修改的。
当然,为了统一这问题,也可以看成 \(f_{r}=a_{r-L}-b_{r+L},g_l=b_{l-L}-a_{l+L}\),提前将 \(L\) 减半即可。
这样增加蚂蚁和增加方糖就统一了起来。

浙公网安备 33010602011771号