APIO2025 一堆题解

APIO2025 一堆题解

图论

AtCoder Xmas Contest 2024 A

答案永远是\(1\),6

NWRRC 2015 Graph

考虑不加边,怎么找字典序最小的拓扑序,就维护一个小根堆即可

然后考虑怎么加边,可以贪心,依旧维护一个小根堆,如果当前小根堆的大小\(=1\),则必须得用了,否则若\(k\)还有剩余,那么我们就可以给这个数加一条入边,然后给这个数放到一个大根堆中,后面再考虑具体连哪里

那么每次小根堆大小\(=1\)的时候,就可以考虑从大根堆里取出点来用了,然后具体的,它的连边就是拓扑序上一位连给它的就行

复杂度\(O(NlogN)\)

APIO2022 游戏

太牛了!

首先显然可以记\(pre_x\)\(suf_x\),表示可以到达\(x\)的前缀特殊点和\(x\)可以到达的后缀特殊点

\(pre_x\geq suf_x\)时就可以return true;

直接维护是\(O(NK)\)

但是因为我们实际上只关心是否有\(pre_x\geq suf_x\),所以考虑把\([pre_x,suf_x]\)当作一个区间,然后放到线段树上对应的那个\(pre_x\leq mid\&\&mid<suf_x\)的节点上

考虑加入一条边\((u,v)\)时的变化:

  • \(u\)的区间和\(v\)的区间相离

此时如果\(u\)的区间在\(v\)的左侧,则无事发生

若在右侧,则就是一个环了

  • \(u\)的区间和\(v\)的区间重合

分讨一下发现无事发生

  • \(u\)的区间和\(v\)的区间呈包含关系

\(v\)的区间在\(u\)的左儿子里,此时\(u\)的区间变成原本区间的左儿子,然后递归下去

\(u\)的区间在\(v\)的右儿子里,此时\(v\)的区间变成原本区间的右儿子,然后递归下去

否则无事发生

复杂度就是\(O((N+M)logK)\)

P9257 [PA 2022] Mędrcy

因为考虑每个咒语只有两个人不会,就可以给这两个人连边

那么一个人可以看到所有不和自己相连的边

考虑一个人什么时候会离开,即它就把它能看到的图当作真正的图,然后模拟出的离开的人和实际上离开的人不一样:

  • 第一天,如果\(x\)的视角中没有边,那\(x\)会离开
  • 第二天,如果\(x\)的视角中,\(y\)和所有其它点都有连边,但\(y\)没离开,则\(x\)会离开

发现这是一个类似子问题的过程,设\(f(G)\)表示图\(G\)的最早有人离开的时刻以及对应的人,则有转移\(f(G)=\min_x f(G-\{x\})+1\)

这个本质是最小点覆盖,这个没啥快速的算法,但是这里\(k\)比较小,就可以考虑点神秘的做法

考虑一般的做法,就是会选一个点,然后看选不选它,如果不选的话它的所有相连的点都要选,这启发我们从度数最大的点开始考虑,当然这里把重边压缩了

但直接这样还是会寄,复杂度大概就是\(T(k)=T(k-1)+T(k-mx_d)+O(N)\),发现如果\(mx_d\geq 3\)的话,复杂度就会降到大概\(O(6e4N)\),而显然\(mx_d\leq 2\)的话我们能直接算

则复杂度大概就是\(O(6e4N)\)的了

CF2080A

首先分成强联通间的边和内的边

之间的边,因为显然呈\(DAG\),所以能删的边就是那些,\((s,t)\),可以通过其他边实现\(s\rightarrow t\)的边,证明就可以考虑一直找下去,总会找到底的

注意强联通缩点后可能出现重边,处理一下

现在考虑强联通块内部的边

首先如果删掉这条边后,还是强联通的,那么这条边就不会删

然后考虑删掉这条边\(i\)过后剩下的强联通分量集合\(S_i\),考虑把所有\(S\)相同的放到一起,显然不同的之间互不影响

发现对于集合为\(S\)\(\{i\}\)\(|S|\geq |\{i\}|\),等于当且仅当就是大致一个环(当然可能不是环,但可以理解为环)

如果\(|S|=|\{i\}|\),就必须留下一个,否则可以全删

复杂度\(O(M(N+M))\)

apio

t3

做法1

做法来自小登来自鲤鱼(?

首先你手模一下,发现最优的情况就是,\(n-[n\%2]\)条边能两两匹配,且匹配起来的边相互垂直

然后考虑先把坐标系划分成\([0,90)\)\([90,180)\),称为一象限和二象限

\(n\)为偶数的情况为例,\(n\)为奇数类似,就是处理一下那条多出来的边

此时显然有一、二象限里的边数都是\(\frac n2\),所以如果有一侧多了,如果一象限多了,那么就把一象限中度数最大的边直接弄到度数为\(90\),如果二多了,就把二中度数最大的边弄到度数为\(0\)

这个过程显然合法

然后因为要求匹配的垂直,考虑一的所有点都是\(0\),二的都是\(90\)显然是合法的,然后考虑怎么构造出这样的局面

考虑把二的所有弄到\(0\)上,一的所有弄到\(90\)

依旧参考上面的调整,这次每次取出二中度数最大的和一中度数最大的,挪到其中一个为\(0/90\),然后结束该次操作

这样合法性也显然

然后操作数显然是\(O(2N)\)级别的

做法2

做法来自小登分享

话说考场上想过这种来着,但是感觉太阴间了不太可能,结果还真行

首先还是得放成一堆直角,然后你发现,当你放出一个直角后,其他的边无论在哪里,和这两条边的和都是\(90°\)

还是以\(n\%2=0\)为例

考虑一个很自然地想法,把边按度数排序后,第\(i\)大的和第\(i+\frac n2\)大的要形成直角

考虑证明直接把\(i+\frac n2\)大的挪到对应的位置就合法

可以归纳证明,首先已经形成直角的可以直接扔掉不管,那么现在考虑边\(i\)\(i+\frac n2\)间夹的边的数量和在没被夹在里面的边的数量是相同的

大分讨一下对于\(i<j\leq\frac n2\)的第\(j\)大的边和第\(j+\frac n2\)大的边,原本它们俩和\(i\)\(i+\frac n2\)的夹角和一定是\(\leq 180°\)的,而我们把\(i\)\(i+\frac n2\)弄成直角后,就是\(=180°\)的了,也即显然不劣

那么这样操作次数就是\(\frac N2\)的了,非常优秀

posted @ 2025-05-19 20:02  LuoyuSitfitw  阅读(145)  评论(0)    收藏  举报