感觉我做了很多CF题,零零碎碎,而且几乎都是水题
所以感觉用处不大。。所以稍微理一理。。。
那就从我打的第一场CF Round #500 开始。
这个数字好整啊(胡说,512才整)
为了方便看中文题意,链接就放洛谷的好了。
依然是给我自己看的,所以是不知所云系列。
目录
(f {Round #500 (Div. 1)})
- D. AB-Strings 每次操作尽量都让段数-2,用个链表维护串串,一堆特判就过了,人类智慧题(所以这题的核心大概是对各种特殊情况的判断)
- E. Cycle sort ,loj 上的翻译好一点。观察到一个结论,任何排列都可以两步换出——先换大圈,再换小圈的第一个,但这样换的总次数多了圈数次。所以再考虑下 (s) 的限制,并且要把所有圈圈尽量连的大一点。(怎么这么烦,还要输出方案QAQ)
(f {Round #589 (Div. 2)})
- D. Complete Tripartite 容易发现两个没边的点一定在同一个set里,所以暴力就好了,注意压复杂度。
- E. Another Filling the Grid
用 (f[i][0/1]) 表示一行里前 (i) 个数有无 (1) 的方案数,可以DP,或者显然 (f[i][0]=(k-1)^i) ,(f[i][1]=k^i-(k-1)^i)
容斥:(ans=sum_{i=0}^{n-1}(-1)^i cdot {n choose i} cdot (k-1)^{ni} cdot f[n-i][1]^n)
DP:用 (g[i]) 表示 (n imes i) 矩阵合法的情况, (g[i]=f[i][1]^n-sum_{j=1}^{i-1} {i choose j} cdot (k-1)^{ni} cdot g[i-j])
比赛时我两种都写了,两种都写错了。。。不想说啥了。。。。。。 - F. One Node is Gone 好像从度数入手就可以了?没啥意思的分类讨论题,不太想写
(f {Avito Cool Challenge 2018})
- G. Mergesort Strikes Back 看了 (n^n) 次的题,依然想不出来。首先我们考虑两个序列的归并,我们可以将这两个序列分成若干块,块的起点满足它左边的数字全部比它小,然后归并就相当于把块按起点排序。再考虑计算两个底层块的贡献,发现第一个块的第 (i) 个数和第二个块的第 (j) 个数对答案的贡献是 (frac{i+j-2}{2(i+j)}=frac{1}{2}-frac{1}{i+j})(如果这 (i+j) 个数的最大值在 (i) 或 (j) 上必然不贡献逆序对,否则有一半的概率贡献逆序对)。
(f {Round #545 (Div. 1)})
- F. Matches Are Not a Child's Play 发现
up x
操作就是把之前的根到 (x) 这一段丢到删除序列的最后,所以可以用LCT维护,up实际上就变成了makeroot。然后可以考虑给每条实链一个标号,表示删除顺序,一个点在删除序列中的位置=标号比它小的点数+splay里右儿子的数量,标号比它小的点数可以用树状数组维护前缀和……因为愚蠢的错误续了两天。。
(f {Round #454 (Div. 1)})
- 454和545可还行。。
- D. Power Tower 扩展欧拉定理:当 (b geq varphi(p)) 时,有(a^b equiv a^{b mod varphi(p)+varphi(p)} (mod p))
一个数经过logn次不停取phi就会变成1,所以递归算就行了。但是写着很晕。。要把快速幂也改成扩展欧拉定理的形式……
(f {Round #575 (Div. 3)})
- F. K-th Path 这个数据范围是假的。只要前 (K) 小的边,然后跑 floyd,复杂度有点炸,但是 O(可过)
(f Codefest 19)
- C. Magic Grid 简单构造题,复读即可。
- D. Restore Permutation 从后往前确定,每次在树状数组上二分就行了。
- F. Bits And Pieces 题解给的做法是SOS DP。。然后我自己乱搞。倒着加数,每次求当前数和后面的最大Or,这个很好求,以前XJ模拟题做过。然后改成 (a_j&a_k) ,只要保证那一位有两个 (1) 就行了……
(f {Round #592 (Div. 1)})
-
A. Ivan the Fool and the Probability Theory 可以发现要么每行黑白相间要么每列黑白相间,所以只要确定第一行或者第一列整个都确定了,所以答案是 (2(fib_n+fib_m-1)) ,-1是因为要把行列都黑白相间的减掉。。
-
B. The World Is Just a Programming Task (Hard Version) 其实把括号序列变成正负1之后求前缀和,那个美丽度就是最小值的个数……
先随便找一个正确循环表示法,然后可以证明只用考虑交换一对匹配括号。一种情况是交换第一层的括号,交换后的美丽度就是括号里套的第二层括号个数+1。另一种是交换第二层的括号,就是原来的+括号里套的+2 。。
-
D. Catowice City 可以发现如果A与B的猫有边,那么选了B的猫就一定要选A的猫。于是给B的猫和A的猫连一条有向边,跑SCC就行了。
-
E. Turtle 首先如果确定了第一行放哪些数,那显然最优的方法是第一行从小到大第二行从大到小……然后大胆猜测乌龟最后走的路径应该是走完第一行再下去或者一开始就下去,于是上背包就好了。需要一定程度的魔改……
(f {Round #576 (Div. 1)})
- C. Matching vs Independent Set 大力猜测必然存在,然后随机就可以出解……正常的做法是在读入的边中依次找出两端点没有被标记的边并给端点打上标记,如果标记的边 (geq n) ,那么显然选这些边就好了,否则没标记过的点肯定 (geq n) ,(3n) 个点的意义就在这里……
(f Technocup 2020 - Elimination Round 2)
- G. To Make 1 这题比较关键的一点是把问题归约到 (sum a_ik^{-b_i}=1) ,而且会发现 (b_i=max b_i) 的起码有两个,每次只要并这两个就行。可以dp,用 (f_{S,x}) 表示是否存在 (b) 使得 (sum_{i in S} a_ik^{-b_i}=x),然后bitset优化。