CTT 2019
感觉整体难度比 CTT 2018 难。
Day 1
A \(\color{blue}\bigstar\)
答辩题。
注意到最后的序列一定是先一堆 \(\text{lca}\) 是 \(1\),然后进入一个子树递归的过程。
设 \(f_{i,j}\) 表示 \(i\) 子树内,外面已经用了 \(j\) 个的方案数。
树上背包合并,还需要容斥一下。
复杂度 \(O(n^4)\)。
B \(\color{Gold}\bigstar\)
二分套二分,然后只需要求一个字符串的价值。
但是内层直接二分是 \(O(nk\log n)\) 的,寄了。
一个很牛的是倍增,倍增出一段 \(2^k\) 不合法,然后再去二分,复杂度就对了。
建 SAM,这样每个串的贡献是一个区间,没了。
C
咕。
Day 2
A \(\color{Gold}\bigstar\)
超级小丑题。
求
单位根反演直接就没了,可以看我前面的博客。
求单位根由于题目满足那个 \(n|(p-1)\),所以直接暴力求就好了。
B
咕。
C \(\color{green}\bigstar\)
简单题,设 \(f_{i,j}\) 表示 \(i\) 第一次走到 \(fa_i\) 之前,期望走过 \(j\) 多少次,那么 \(f_{i,i}=\dfrac{s_i}{v_{fa_i}}\),其中 \(s_i\) 表示 \(i\) 周围一圈 \(v\) 的和。
向下的转移推一下,发现一些东西抵消了 \(f_{i,j}\) 只和 \(i,j\) 有关。
树上差分一下做完了。
Day 3
A
不会。
B \(\color{blue}\bigstar\)
牛逼题啊。
这个操作一开始看的时候完全不会,在做另外一个题的时候模拟了一下交换序列中两个元素后差分数组的变化,然后会做了。
对于 \(i\in [2,n-1]\),这个操作本质上就是交换前缀和数组上的两个数,然后排序即可。
但是还有两端的操作,由于这是个环,所以很难处理。
想了一万年,发现可以把序列扩展成一个无限序列,那么两端的操作也就可以做了。
比如对于样例 2 2 -3
,前缀和后得到 0 2 4 1
,扩展一下得到:
|-1 1 3 | 0 2 4 | 1 3 5 | 2 4 6 |
那么左右的交换就可以了。
但是此时的交换会使得每一段都交换,最后如果一段排序了,那么整个序列肯定也排好序了。
问题转换成有一个无限长的序列,满足 \(a_{i+n}=a_i+K\) ,每次可以把 \(\bmod n\) 相邻的所有位置交换,求排序最小次数。
倒过来,把最后排好序的序列中找到这几个数,然后拿回来。
设 \(b_i\) 表示 \(i\) 在第几段里面,然后考虑先把所有数放到同一段里面,然后再考虑调整,放到同一段里面的代价就是 \(\sum |b_i-b_j|\) 考虑每两个的贡献即可。
剩下调整的部分,一个是要内部东西有序,还有一个是可以把一部分放后面,这两部分讨论一下即可。
C
不会。
Day 4
A \(\color{green}\bigstar\)
简单题,数位 dp,枚举到第一个不到达上界的位置,此时注意到由于异或的性质,后面异或出 \([0,2^k-1]\) 的方案是相等的,所以只需要求 \(O(\log n)\) 个区间 \(d\) 次幂和,直接来就是 \(O(d\log n)\)。
B \(\color{green}\bigstar\)
????
根据贝叶斯,主持人选一个门,会让当前所选的门概率除以 \(n-2\),其他除以 \(n-1\),然后可以直接暴力,枚举主持人扔那个门,复杂度 \(O(n!)\)。
打个表,发现 \(n=11\) 的时候答案是 \(0\)。
推一下,发现只有 \(n\le 10\) 答案不是 \(0\)。
把这个 \(n\) 解出来就没了,没啥意思。
C \(\color{Gold}\bigstar\)
霍尔定理 dp 做一年,不会。
结果是直接贪心,从右往左,能选 \(B\) 就选 \(B\),否则选 \(A\),调整一下证明发现是对的。