APIO 2025 游记

Day 0

飞去无锡的省锡中。跟 wtc 和 lzc 一个宿舍。

Day 1

lhf 的图论杂题选讲

讲几道印象深刻的。

[PA 2022] Mędrcy

相当有趣。

\(n\) 个贤者和 \(m\) 条咒语,每个贤者可能会一些咒语。每条咒语都恰有 \(2\) 个贤者不会这条咒语。贤者们不知道有多少条咒语,但是他们知道对于每条他自己会的咒语具体哪两个人不会这条咒语,以及如果还存在他不会的咒语恰有两个人不会这条咒语(其中包括他自己)。贤者每天中午都会碰一次头,然后他们能且仅能知晓现在还剩多少个人。如果某天中午某个贤者意识到存在他不会的咒语,那么他就会在当天午夜神隐。第 \(0\) 天的中午所有的贤者被告知至少存在一条咒语,以上所有信息你都知道,问最早有贤者缺席那天的日期和与会情况。

Solution

每个咒语对应两个不会它的贤者之间的一条边,这样每个人看不到与他相连的边,其他边都能看到。

我们记 \(x\) 的邻域集合(即与它相连的边的集合)为 \(N_x\)

如果有人什么咒语也不会,即 \(N_x=E\),那么他/他们当天午夜就走了,其他人什么信息也没有得到。

因此,如果某个人 \(x\) 看见在他的视角中本应该什么都不会的一个人 \(y\) 第一天出席了,\(N_y\backslash N_x=E\backslash N_x\iff N_x\cup N_y=E\),他就知道 \(y\) 一定掌握了他所不知道的咒语,然后在第一天午夜神隐。

类似的,如果 \(N_z\backslash (N_x\cup N_y)=E\backslash (N_x\cup N_y)\iff N_x\cup N_y\cup N_z=E\),那么 \(x\) 应当在第二天午夜神隐。

由此我们可以知道:题目要求我们寻找最小的点集 \(S\),使得 \(\bigcup_{x\in S}N_x=E\),即最小点覆盖。

一般图最小点覆盖是 NPC 问题,不过我们只需要求出 \(|S|\le k\) 的一个解。

cxy 的子集幂级数

lhx 的不平等博弈

学习笔记

fsz 的构造选讲

开幕式

从小培养打胶的能力.jpg

Day 1

省流:签到放 T3,还是个诈骗题。T1 逆天 BSGS,T2 逆天大分讨。

T1

题意:你想要知道一个正整数 \(n(n\le 10^9)\),你每次可以询问一个数组 \(x\),得到回答 \(\sum_{i<j}[x_i\equiv x_j\pmod n]\)。你需要保证每次询问的数组 \(x\) 长度之和不超过 \(110~000\),如果长度之和不超过 \(10^6\) 可以得到一系列部分分。

首先其实 subtask2 很好想,一种做法就是询问一次 \([1,10^6]\) 的所有整数,不难发现对于不同的 \(n\) 询问结果也不一样,就是 \(\sum_{n|m}\lfloor\frac{10^6}{m}\rfloor\),直接枚举一遍就可以了。这个做法是线性的无疑吧?怎么就把我给 T 掉了???

场上一直在想 T1,被降智了,以为如果 \(n\) 是一个大质数的情况下即使一次全部问完也大概率得不到一个冲突。

实际上如果你一次随机问 \(k\)\([1,10^{18}]\) 中的数没有冲突的概率大概为 \(O((10^{-8})^{k^2/2})\) 个,因为因子个数函数 \(d(n)=O(\sqrt n)\)

所以你随机问得够多很大概率可以得到一个冲突。

所谓「冲突」是两个数之间的关系,毕竟得到「存在冲突」并不能知道具体是那两个数,而在所有数都是随机的情况下,我们必须知道确切是哪两个数才可以得到关于 \(n\) 的信息。

显然,我们可以把询问的集合 \(S\) 均匀地划分为 \(A\)\(B\),这样 \(q(S)=q(A)+q(B)+q(A,B)\)。这告诉我们如何求出集合到另一个集合的冲突数。

接下来是一个比较正常的思路,把 \(A\) 均匀地划分为 \(A_1\)\(A_2\),分别询问 \(q(A_1,B),q(A_2,B)\) 即可把 \(A\) 的大小减小一半,\(B\) 同理。

比方说,你最后算出来有一个 \(x\equiv y\pmod n\),那么把所有的这样的 \(|y-x|\) 取一个 \(\rm lcm\) 即可。

这个做法不知道能拿多少分。

另外一个思路是:你发现你的第一步其实是问值域 \([1,10^9]\) 内是否有一个 \(n\);我们不妨在这个值域上二分,每次需要判断当前二分的区间 \(L,R\) 内是否存在一个 \(n\)

这时候有一个很妙的思路:BSGS。

\(B=\sqrt{R-L+1}\)

询问 \(\{1,2,\dots,B\}\)\(\{L+kB|1\le k<B\}\cup\{R+1\}\) 之间的冲突,不难发现,这样正好可以覆盖 \([L,R]\)

这样在 luogu 数据可以拿到 54 分。

T2

题意:有一行长度为 \(n\) 的序列 \(p_i\);又有一个 \(m\) 个点 \(e\) 条边的无向连通图。Alice 与 Bob 在玩游戏,每次 Alice 可以给图中 \(m\) 个点赋一个 \([1,n]\) 的互不相同的位置(保证 \(m\le n\)),然后 Bob 可以选择图中一条边,并交换两个端点对应位置的权值。最终 Alice 希望 \(p_i=i\)\(i\) 的位置尽量多;而 Bob 恰恰相反。
你要实现一个 Alice(m,e,u,v,n,p) 的函数,返回双方都按最优策略行动的情况下,Alice 获得的分数。在此之前,你需要调用若干次 Bob(t) 以使分数至少达到返回的分数。值得注意的是,交互中的 Bob 并不一定按照最优策略移动为了防止选手查看交互库

\(m=2\) 的部分分是简单的,最终一定会返回 \(n\)

\(e>m\)

这时你发现 \(e>m\)\(m=2\) 竟然只能拿一个分数,这说明什么?这说明 Alice 会直接不玩了,并返回 \(\sum_{i=1}^n[p_i=i]\)

下面我们来证明这一点:当 \(e>m\) 时,根据握手定理 \(2e=\sum_{i=1}^md_i\) ——其中 \(d_i\) 表示 点 \(i\) 的度数——和容斥原理,我们可以知道一定存在一个点的度数 \(>2\)

如果存在一个 \(3\) 度点,那么 Bob 一定可以操作一次 \((u,v)\),其中 \(u\) 是这个 \(3\) 度点,以使得操作完之后 \(p_u\ne u\)\(p_v\ne v\)。因为只要避开 \(u\) 的邻居中的(操作前的)\(p_u\)\(p^{-1}_u\) 即可。

\(e=m-1\)

其实现在图不只是一棵树。因为你可以事先判断是否存在 \(3\) 度点,往后我们将假定图中不存在 \(3\) 度点,即图是链或者环的情况。而这个部分分就是说图是一条链。

根据经验,让我们连接 \(i\to p_i\),构成若干循环。如果把这条链按顺序放在一个环上,会促使 Bob 拆出来一个点;如果放在多个环上,Bob 可能会连接这两个环。

策略已经很明显了:我们先把所有的环连接起来,然后可以拆出来 \(n-(m-1)\) 个单点。当然如果你事先就是单点可以不用管它。

\(e=m=3\)

把三个点连续地放在一个环上,那么 Bob 可以拆出一个大小为 \(1\) 或者 \(2\) 的环。你可以猜想 Bob 永远会拆出一个二元环,除非这个环的大小恰为 \(3\)。那么 Alice 得到的分数即为初始时奇环的数量。

可以证明这是 Alice 能获得的最大分数。因为 Alice 无论如何都无法把一个偶环拆成两个奇环。考虑「在环上放点」的过程相当于选择 \(x+y+z=n\) 其中 \(x,y,z\in \Z^+\),然后让 Bob 选择拆成 \(x+y,z\)\(x+z,y\)\(y+z,x\) 之一。显然你最多拆成两个奇数和一个偶数,然后 Bob 选择拆出来那个偶数即可。

\(e=m=\) 奇数

其实可以拓展上面的证明。考虑对偶环黑白染色,那么当你在上面选择奇数个点时,一定会出现两个相邻点的颜色相同,Bob 选择这条边就会拆出两个偶环了。

但是这里还有另外一种情况需要处理:可能会出现大小小于 \(m\) 的奇环,这种环你是拆不了的。你只能把它跟偶环连接。显然,我们一定会优先让最大的奇环与其他偶环连接。有时候,你甚至找不到多余的偶环,贪心地,此时你一定会优先找比较大的奇环合并成偶环。

\(e=m=4\)

对于 \(\ge 6\) 的环,都可以选择 \([0,1,5,4]\) 来拆掉一个 \(1\) 元环或者 \(4\) 元环。对于 \(4\) 元环,显然可以拆成 \(1\) 元环和 \(3\) 元环。

因此我们每次都尽量这么操作,同时把不能搞的环连接起来继续搞。

\(e=m=\) 偶数

不会。太难了。

T3

题意:极坐标系中有 \(n\) 条直线。你每次可以选择其中一个子集同时旋转一个角度。你想要使任意两条直线的夹角(锐角)的和最小,且每次操作后的这个值不会变小。

首先容易猜出来一定可以达到最大值 \(\left\lfloor\dfrac n2\right\rfloor^2 90°+[n\equiv 1\pmod 2]90°\)

然!而!由于赛场上脑抽了,而且我数学太差了,而且因为这个**出题人给的 2 000 000 的巨大限制,我认为最终一定可以把所有的直线放在同一个直角上。然后场上照着这个调了半天,一直都是 Energy decreased其实这个应该也是可以做的只是我太菜了

其实你看到最后一条直线可以随便放就应该可以意识到前面的直线也可以随便放。但是我没有意识到。

你发现如果两条直线构成一个直角,那么别的直线与这两条直线的贡献之和恰为 \(90°\),达到最大值。因此,只要两两配对成 \(90°\) 即可。

上面的结论还告诉我们,无论怎么动一条直线,都不会影响其对已经成对的直线的贡献。因此,如果两条直线已经配对成功,我们就可以把它们删掉了。

考虑任意一条直线,我们一定可以把它往左或者往右移以使得总贡献不变小的情况下与某条边配对。只需要检查四个象限内的边的数量即可,这个可以用值域树状数组处理。

但其实没有必要,直接排序后 \(i\)\(i+n/2\) 配对就是对的。

Day 2

lsy 的电阻网络与随机游走

待补


下午参观 702 所。国家机密不让带手机。所以这个跟 OI 有什么关系啊

posted @ 2025-05-20 21:48  justalearner  阅读(44)  评论(0)    收藏  举报