AtCoder Regular Contest 131 (A-E)
有的人,vp了一场 tyh 30分钟切掉三题的ARC,补题补到E 用了三天是怎么一回事呢,小编也很好奇
详细揭秘
留个 悬念
A
答案可以是 \(y*1000000000/2+x\) 这样就不会相互影响。
B
一个格子相邻的只有四个格子,而我们有五种颜色,直接扫一遍每次随便选一个能填。
C
题意:\(n\) 个互不相同的非零的数,A、B轮流取一个,取完xor和为0者赢。问你先手是否必胜。
题解:
和之前模拟赛的一道题非常像,都是讨论下奇偶,但那题是拿完后 xor和是0 的输
-
如果 \(n\) 是奇数,那么游戏必定在奇数次操作后结束(先手必胜)。
Proof
即证,游戏不会在偶数次操作后结束。
即证,游戏不会在2次后结束,因为2次后再次达到奇数局面。
如果2次后奇数,也就是后手胜,就说明取的 \(x\) 和 \(y\) 满足 \(x\xor y=0\),因为互不相同,所以一对,一对的,最后也会剩下一个没人匹配的。先手取那个就无敌了。 -
如果 \(n\) 是偶数,那么先手第一步要是不赢,后手就会变成一个奇数个数的游戏的先手,它必胜,所以先手第一步必须赢。
那么就做完了。
D
先来三个结论:
- 让箭与箭距离为 \(D\),让中间的那根属于 \([-D,D]\),是最优的。
- 因为是对称的,所以中间那根属于 \([0,D]\) 就是最优的。注意是(n+2)/2,否则会错。
- 枚举中间那根的位置的时候,它肯定是在整数位置上的。小数位置没啥意义。
问题在于,直接枚举是 \(O(ND)\) 的,我们考虑如何在 \(O(N+D)\) 的时间内计算出中间那根位于 \([0,D]\) 的所有位置的答案。
\(st\) 是 中间那根位于0时最左边那根的位置。\(delta\) 是中间那根现在的位置。
\(l\le st+delta+kD \le r\) (边界预处理的时候搞到能取等)。\(k\in [0,D),delta\in [0,D]\) 要求对于 \([l,r]\) 的合法 \(k\) 的个数
$\frac {l-st-delta} D \le k \le \frac {r-st-delta} D $
\(\lceil \frac {l-st-delta} {D} \rceil \le k \le \lfloor \frac {r-st-delta} {D} \rfloor\)
由于 \(delta\in [0,D]\)
所以对于 一段区间,\(k\) 的个数,会在至多两个位置变动1,那么我们可以维护一个答案的差分数组,最后前缀和一下就行了。
写起来非常恶心。。。可能是因为我不太擅长处理这种东东。。
E
可以爬山。
下面考虑其他做法。
对于每个 \(i\),我们钦定 \((1,i),(2,i)...,(i-1,i)\) 都是某种相同的颜色,可以保证没有异色环。
也就说,我们能够将 \(1,2,...,n-1\) 分成和相等的三组。
如果我们在完全图的总边数是 \(3\) 的倍数的时候都能找到解(3,4,5除外,他们都必定没有解),那这肯定是正确做法了。(也就是要求 \(n\bmod 3 \neq 2\) 时都有解)这个之后数学构造的方法可以证明。
我们有三种做法:
- 动态规划:我们可以写一个 \(O(n^5)\) 的dp。状态 \(dp[i][sum1][sum2]\) 前 \(i\) 个,第一组大小,第二组大小。
- 随机:实际上 \(s\) 相等的三组个数在 \(n\le 50\) 时密度非常大,随机每个 \(i\) 给哪种颜色就能过。不懂。大受震撼。
- 数学构造:
- \(n=3:\) 显然无解
- \(n=4:\) 样例就是,无解
- \(n=5:\)边数不是4的倍数
- \(n=6:(1,4),(2,3),(5)\)
- \(n=7:(1,6),(2,5),(4,3)\)
- \(n=8:\)边数不是3的倍数
- \(n=9:(1,2,3,6),(5,7),(4,8)\)
- \(n=10:(1,2,3,4,5),(7,8),(6,9)\)
- \(n=11:\)边数不是3的倍数
现在我们只要能把 \(n\) 从 \(n-6\) 转移过来,那就能够给出所有边数是3的图的解了。
分别在三组里加入 \((n-1,n-6),(n-2,n-5),(n-3,n-4)\) 即可。