【251031】CF2155 Div.2 vp 总结
题目梗概
| 题目编号 | 题目名称 | 题目链接 |
|---|---|---|
| A | El fucho | Link |
| B | Abraham's Great Escape | Link |
| C | The Ancient Wizards' Capes | Link |
| D | Batteries | Link |
| E | Mimo & Yuyu | Link |
| F | Juan's Colorful Tree | Link |
给的都是 VJ 的链接,带翻译。
赛时情况
习惯了,先把所有题目读一遍。
A 题看起来是模拟,\(n\) 又那么小;B 是构造,哇我完蛋了我构造特弱;然后看了 C,看着像是 DP 什么的,不过样例好奇妙,答案都那么小(伏笔!);D 是什么鬼,还整上交互了;E 是博弈,好难好难好难的样子;至于 F,我什么都不知道呢。
做 A。写完代码以后测了一下 \(n=500\),是 \(998\)。啊那没事了就算全部模拟一遍也过得去。
不想管了,开 B!噼里啪啦瞎摇了一通,似乎想到了一种神秘的构造方法,随便试了几个,都能过去。然后分析了一会儿无解情况,于是开写。样例没毛病,目光扫视代码几遍以后直接跳了。
C 启动,想了一阵子 DP,发现自己死挺惨的,什么也玩不出来。然后开始观察样例,发现一些神秘的性质!然后发现答案最大 \(2\)(呼应伏笔 qwq)。死鬼 CF,还说要对什么 \(676767677\) 取模呢,真好笑。然后开始写,结果样例全输出 \(0\),不解的我把差分数组打出来一看——怎么都少 \(1\)?看了一遍题,哦我忘了算上 \(i\) 自己。弄完以后,过样例,不想管了开 D。
交互交互交互交互。好难好难好难好难。瞎整了一些东西,发现疑似可以分块(?什么破思路),于是决定把这 \(n\) 个电池分成 \(n\) 组,然后每次不断合并,然后查一个组内的情况。虽然很猎奇,但是浅浅算了一下,好像次数够,于是就开写了。代码比思路更猎奇,中途还写错了一些,不过还好在写的同时给找出来了。
开测样例,次数啥的都没问题,只是觉得自己的代码好傻,反复问两个同样的电池。思考如何解决这个问题。突然想到 \(n\) 只有 \(40\) 来着!噢,那随便弄都行,开了个二维 bool 数组 \(vis\),\(vis_{x,y}\) 存 \((x,y)\) 这对组合问没问过。然后又试了一下,嗯,现在聪明多了。
觉得这个 D 好不保险的样子啊,随便编了几组东西测了测,次数都少好多,不想测了。
然后开了 E,想了好一会,不知道怎么处理这个什么最优策略。好难啊,好难啊,根本没有一点思路。瞎摇了一些东西,但是始终不知道怎么弄。话说这个矩阵还变来变去的太难整了!更何况 \(n\) 和 \(m\) 的总和还没有限制,好难!研究了一下,想用平常的博弈 DP 的思路去解决,问题在于这个状态吧……根本不知道怎么设啊喂!神秘死了,被气死了,不想 E 了。
意料之中,意料之中,我怎么可能做得出来 Div.2 的 E 呢(喂喂喂你不能这么说)?F 就更不可能了,但是无聊的我还是想去看一下。想了想,毫无思路,只是觉得百分百要上 LCA,但其他就什么都不知道了。摇了摇样例,没有任何头绪。
看了看时间,四点四十了,那最后留点时间检查下前面的代码吧。五点交卷,后面还有点时间看下没 A 的题是怎么回事,以及看一下后两题咋做。题今天下午肯定没时间补的,之后抽时间嘛,周末有一大把的时间啊!我又考不了今年的 CSP。
诶诶,怎么扯了这么多废话,于是开始检查前面的题,测了下样例,然后大眼瞪法检查代码,没查出什么毛病。又玩了一下 D 的代码,真好玩呀真好玩。(D 题代码:不是我好端端一个代码怎么被你玩得跟个游戏似的?我有那么好玩吗?)
又看了下时间,四点五十二了,准备交卷。打开 CF,登上号,提交!提交!提交!提交!
分数分布
A B C D 全过,很开心。
赛后题解
A
话不多说,直接模拟即可,用 \(x\) 和 \(y\) 存一下当前胜者组和败者组的队伍数,按着它的套路算就行。注意计算顺序,不行就多开点临时变量。然后记得最后答案要 \(+1\) 因为还有最后一个总决赛。
B
简单构造题。
首先考虑从上到下从左往右造 \(k\) 个向上 U 的格子,这样这 \(k\) 个肯定出不去。
然后考虑如何让剩下 \(n^2 - k\) 个被困在迷宫里打圈圈。
先让所有没被打上向上 U 的非最后一行的格子全都打上 D,让它们全进到最后一行,然后再想如何困住。
很简单,最后一行的前 \(n-1\) 个全给往右 L,最后一个给往左 R 就行了。这样就会被控制在 \((n,n-1)\) 和 \((n,n)\) 两个格子里走来走去走来走去了。
无解情况?当且仅当 \(k = n^2 - 1\) 的时候才会无解,因为这个时候只有一个格子是走不出去的,但是它要么直接走出去了,要么会走到一个走得出去的格子里,所以是没有办法构造出来的。
C
CF 是懂迷惑人的。
题目给了个什么对 \(676767677\) 取模,实际上毫无必要因为答案最大 \(2\)。
为什么呢?因为考虑两个相邻的 \(a_{i-1}\) 和 \(a_i\),发现它们的差值顶多 \(2\)。因为它们的差距只在相互能否看到对方而已。
那么只要固定了第一个人的披斗篷方式,后面的人就全能算出来了,当然嘛有无解情况,也就是后面的人算出来不存在什么的。
定义 \(c_i\) 表示第 \(i\) 个人的披斗篷方式,其中 \(c_i = 0\) 表示第 \(i\) 个人的斗篷往左披,\(c_i = 1\) 则表示第 \(i\) 个人的斗篷往右披。
于是我们枚举 \(c_1 \in \{0,1\}\),然后可以推出式子:对于每个 \(i>1\),都有 \(c_i = a_{i-1}-a_i+1-a_{i-1}\)。当然了如果 $c_i < 0 $ 或者 \(c_i > 1\) 那么显然这种情况不存在。
求出来以后就可以了吗?为了保险我验证了一下。简单写个差分就可以啦,记得算上自己可以看到自己的情况。
D
肯定不能一个一个试那绝对会挂完。
我的方法很奇怪。但是能过就对了。
大概就是,先把这 \(n\) 个电池分成 \(n\) 组,每组一个电池。只要还没找到一组,我就一直 while 下去,直到找到!
while 里头干啥嘞?首先合并这些电池组。咋个合并法?很简单,就是选相邻两个并起来,并成新的电池组,于是个数就会是上次的一半。由于 \(n\) 特小,所以咋搞都行。
接着咱枚举每个电池组中的两个不相同的元素 \(x,y\),然后询问 \(x,y\) 可不可以通电。如果回答了 \(1\),OK 那咱直接把程序结束,因为找到了嘛!回答了 \(0\),那咱不管,就让它继续回答着。
如果这一次所有的电池组中都没能找到两个都可以通电的电池,那么我们可以决定一件事,那就是 \(a \le cnt\),其中 \(cnt\) 是当前电池组的数量。抽屉原理嘛。因此一直这样走下去,越往后走,你所知的剩余次数其实就越多,因为 \(a\) 的数据范围在不断缩小。
那么最后的询问次数大概是什么样的呢?我粗略地算了一下,莫约是 \(\left \lfloor \dfrac{n^2}{2\lceil \frac{a}{2} \rceil} \right \rfloor\) 的,嗯,和题目给的范围 \(\left \lfloor \dfrac{n^2}{a} \right \rfloor\) 差不多,还稍微少一些些,肯定能过啦!
E
分类讨论。
- \(n=1\):
- 这个时候总步数是固定的,只需要考虑奇偶性,奇数则先手赢,否则后手赢。
- 设 \(f_i\) 表示在第 \(i\) 列的一个 token 贡献的总步数。
- 易得出 \(f_1 = 0\),\(f_i = 1 + \sum_{j=1}^{i-1} f_i (i>1)\)。
- 然后可以发现 \(f_i = 2^{i-2}(i>1)\),结合 \(2\) 的次幂的性质,所有 \(i \ge 3\) 的列对奇偶性都毫无贡献。
- 于是只需要看第 \(2\) 列的 token 个数,为奇数则先手赢,否则后手赢。
- \(n>1\):
- 观察发现,将 token 上下移动就能将对应列的 token 个数 \(+1\),相当于改变这一列的 token 个数的奇偶性。
- 假如每列的 token 个数都是偶数,后手就可以根据先手的操作情况决定自己的操作情况——就像取石子那样,所以后手必胜。
- 但是当存在部分列的 token 个数是奇数的时候,先手可以选择最靠右一列然后将所有这些是奇数的全改成偶数,然后用和上面后手一样的套路,于是先手就可以赢了。
简单判断一下即可。
F
对于每个颜色 \(x\),我们求出含有颜色 \(x\) 的点的森林,对于其中的每个连通块 \(S\),我们发现,如果要颜色 \(x\) 对 \((u,v)\) 这对点组造成贡献,只需要满足 \(u,v \in S\) 即可。
那么问题就完全转化了,和树压根无关。这里把 \(n,s,q\) 均当做 \(n\) 来看待。于是题目就等同于是给定 \(n\) 个集合(并且保证这些集合的大小之和不会超过 \(n\)),对于每个点组 \((u,v)\) 求有多少个集合包含 \(u,v\) 两个数。
考虑根号算法。设 \(B = \sqrt{q}\),实际可取 \(400\)。
把所有的点按照 \(B\) 对半切割,分成两部分,一部分是度 \(\le B\) 的,还有一部分是度 \(> B\) 的。
先预处理集合 \(T_u\),对于每组询问都把 \(v\) 加入 \(T_u\) 集合。
如果一个询问是由两个度 \(\le B\) 的点构成的,显然这些点的集合 \(T\) 的大小不会超过 \(B\)(可能有常树,但总之数量级是 \(O(B)\) 的)。然后我们遍历所有集合,走到 \(u\) 就给它打上标记。然后后面再跑 \(v\),这样就能对应上算出答案了。
然后再考虑一个询问出现了度 \(> B\) 的点的情况。直接对于每个度 \(>B\) 的 \(u\),暴力遍历所有集合,如果在某个集合里它出现了,就把这个集合内所有在 \(T_u\) 内的数全都算进它的贡献里。
然后看一下两边的时间复杂度,都是 \(O(n \sqrt{q})\) 的,没什么问题。
简单总结
总而言之,言而总之——还算满意吧。
如果能推出 E 来那就更好了。
F 我倒是不指望考场上能推出来什么,不过一定能写暴力就对了。
再接再厉。
小彩蛋:
……F 就更不可能了,但是无聊的我还是想去看一下。想了想,毫无思路,只是觉得百分百要上 LCA,但其他就……
——节选自【赛时情况】部分。
然鹅后面的题解没有提到任何和 LCA 相关的东西,因为树的性质被搞没用了。简单地说就是题意转化了嘛。
所以百分之百是不准确的。准确的应该是百分之一百二十,甚至百分之一万。

浙公网安备 33010602011771号