最近决定写一些CF Div.1的题,练习一下速度和代码能力。
暂定从中考后的Codeforces Round #572开始。
大部分比较简单的题直接把题解写在这里,不单独开文章了。

Codeforces Round #572 (Div. 1)

Codeforces Round #573 (Div. 1)

Codeforces Global Round 4

Codeforces Round #576 (Div. 1)

省略: A,B

Codeforces Round #580 (Div. 1)

Codeforces Round #583 (Div. 1 + Div. 2)

Codeforces Round #584 (Div. 1 + Div. 2)

Codeforces Round #586 (Div. 1 + Div. 2)

E

以起点为根建DFS树,对于所有子树内没有任何一条返祖边指向子树外的子树,我们无法获得它内部的点权,但是可以获得其内部最大权垂直链的点权,而其他点的点权都可以获得,因此答案就是所有这种子树的内部最大权垂直链的最大值加上其余点的点权和。
时间复杂度\(O(n)\).
代码: 60831008

Codeforces Round #588 (Div. 1)

Codeforces Round #591 (Div. 1)

Codeforces Global Round 5

省略: A,B

C

考虑二维怎么做: 按\(x\)排序,把每个\(x\)的点两两配对,消到只剩最多一个。然后相邻的配对,显然不会有相交。
三维就先按\(z\)排序,对每个二维平面执行二维算法,消到只剩最多一个。然后相邻的配对,显然也不会有交。
时间复杂度\(O(n\log n)\).
代码: 62854906

D

显然答案要么全是\(-1\), 要么全都不超过\(3n\). 将数组复制\(3\)倍,预处理\(r_i\)表示第\(i\)个点后面第一个小于其一半的位置,则某个点能延伸到的最远点就是上述数组的后缀最小值,减去该点的原始位置就是答案。
也可以对每个点二分然后用数据结构实现。
时间复杂度\(O(n\log n)\).
代码: 62725216

E

树的形态是一棵满二叉树下面挂若干个儿子,且要求每个点的左儿子的右儿子大小为奇数,右儿子的左儿子大小为偶数。那么考虑在两棵深度相同的树上加一个根合并起来,右儿子的左端点个数奇偶性会限制右儿子最左边的链上左儿子的有无,归纳易证只有左儿子最左边的链上儿子可有可无,其余的方案是确定的,答案一定为\(0\)\(1\), 且对于一种深度,只有两个相差\(1\)\(n\)答案是\(1\).
考虑生成答案为\(1\)的集合,归纳可证每次将两个数同时加上两数中的偶数\(+1\),就可以得到下一层的两个数。
时间复杂度\(O(\log n)\).
代码: 62864619

Codeforces Round #594 (Div. 1)

Codeforces Round #596 (Div. 1)

A

显然答案不超过\(\log n\). 枚举答案,转化为\(k\)\(2\)的幂次和为\(n-ak\). 求出最少需要几个(\(\text{bitcnt}(n-ak)\))和最多需要几个(\(n-ak\)),若\(i\)介于两数之间则可以。
时间复杂度\(O(\log n)\)\(O(\log^2n)\).
代码: 63769126

B

把一个数看作长度为\(10^5\)的数组,第\(i\)个位置若\(i\)不是质数则为\(0\), 否则为这个质数的幂次\(\mod k\). 将这个数组用\(m\)进制进行Hash并插入map中,在map中查询其每一位取负后的Hash值。
时间复杂度\(O(n\sqrt n)\)\(O(n\log n)\).
代码: 63771856

C

某个位置的操作不会影响在它右下方的矩形。
\(f[i][j]\)表示从\((1,1)\)\((i,j)\)且在\((i,j)\)点由朝右转向朝下的方案数,\(g[i][j]\)表示从\((1,1)\)\((i,j)\)且在\((i,j)\)由朝下转为朝右的方案数。
则有转移方程: \(f[i][j]=\sum^{j-1}_{k=lf[i][j]}g[k][j], g[i][j]=\sum^{i-1}_{k=lg[i][j]}f[i][k]\), 其中\(lf[i][j]\)等于最大的\(k\)使得\(sumx[i][k+1]\le n-k\), \(sumx[i][j]\)是第\(i\)\(j\)处的后缀和,\(lg\)同理。这两个数组可以\(O(nm)\)双指针预处理,前缀和优化DP即可。
更简单的实现方式: 从后往前DP, 这样无需处理\(lf\)\(lg\), \(lf[i][j]\)直接等于\(m-sumx[j]-1\).
时间复杂度\(O(nm)\).
代码: 63768042

01-08 07:22