$\newcommand{le}{\leqslant}\newcommand{ge}{\geqslant}$

Manthan Codefest'19(CF1208) 学习

考场总结

按顺序做题,从A做到E. 而且这场审题一直不过关,导致D, E耗时过久。于是被总时间和我差不多但是做题顺序是D-E-A-B-C的省队大佬踩了。

A. XORinacci

题意:$f(0)=a, f(1)=b, f(n)=f(n-1) \oplus f(n-2)~(n>1)$, 求 $f(k).$

考场策略:多写几项发现是循环数列。

B. Uniqueness

题意:在数列(长度不超过 $2000$)中删除尽量短的一个连续子列使得其无重复元素。

考场策略:一开始想写个贪心,枚举一下删除段的左端点,后面发现后缀可能也会有相同元素。发现长度平方可过,就愉快枚举前缀长度枚举后缀长度了。

题解做法:考虑到这是B题,懒得离散化了,直接用集合维护值有没重复。

C. Magic Grid

题意:已知 $4k\times4k$ 方格,求一种 $0, 1, \ldots, 16k^2-1$ 的填法使每行每列异或和相等。

考场策略:样例有点花哨,果断放弃。首先发现 $4k$ 是 $2$ 的幂时从上到下从左到右依次填入 $0, 1, \ldots, 16k^2-1$ 就合法。然后自己写了个检验器发现 $4k=12$ 时这种做法不可取,然后试图分成 $4\times4$ 个正方形区域,每个区域填入 $0, 1, \ldots, k^2-1$ 的偏移(也就是整体加上某个数),发现也不对。最后改成 $0, 16, \ldots, 16(k^2-1)$ 及其偏移就对了。测了 $4k=1000$ 发现还是对的,果断交了。

题解做法:先随便搞一个 $\frac N2$ 见方的方格的填法,然后乘 $4$ 再加上 $0, 1, 2, 3$ 的偏移复制到每个区域。由于 $\frac N2$ 是偶数,偏移会自我抵消。因此每行每列异或和都是 $0$.

D. Restore Permutation

题意:求一个 $1, 2, \ldots, n$ 的排列 $p_i$, 使得对于任意 $i$, 排在 $p_i$ 之前且比它小的数之和为给定数 $s_i$.

考场策略:本场血亏题。倒过来考虑,如果填好了 $s_{i+1}$ 至 $s_n$, 目前没有填过的集合 $S$ 中小于 $p_i$ 的所有数之和将为 $s_i$. 为维护从集合中删去元素和二分前缀,用线段树求和。当时想了两种思路,一种是单点修改二分查询和,一种是后缀修改二分查询最大值,最后把这两种做法写混了,又打了标记又维护和,交上去WA了。于是只好自己写一个数据生成器,每次随机一个 $p$ 然后生成 $s$, 还好由于 $p$ 唯一不用写暴力。于是就发现之前的代码全篇卖萌,改改改,二分的边界也判得奇奇怪怪,改改改,终于拍上了,交。用时半小时有余。

题解做法:按数从小到大填,最小数就会出现在最后一个 $0$ 的位置,然后在后缀中扣除这个最小数,线段树维护之。

E. Let Them Slide

题意:宽度为 $w$ 的桌子上纵向放有 $n$ 条纸带,纸带每格上都写有(可以为负的)整数,可以任意地横向拉动纸带,但要保证其完全在桌子上。对于每列都求最优的纸带位置方案,使得其和最大,注意如果某行没有纸带则算作 $0.$

考场策略:本场血亏题$\times 2$. 一开始以为贡献最大值的要么是前缀,要么是后缀,还没发现可能整数为负、某行可能可以没有纸带,甚至把和想成最大值,线段树都写完了。后面发现过长的纸带甚至只能由区间贡献最大值。于是把纸带拿来从短到长排序,每次区间变动的时候修改,用单调队列维护。输出优化还忘记支持负数,WA了一发,发现答案可能为负。

省队大佬做法:不需要排序,直接对每条纸带求最大值变动时的变化量,记在对应时刻,最后求前缀和。


F. Bits and Pieces

题意:对于数列 $\{a_n\}$ 求 $\max\{a_i \mathop{\mathrm{OR}} (a_j \mathop{\mathrm{AND}} a_k) \mid i<j<k\}$.

笔记:枚举 $a_i$, 从高到低位判断是否可以加进某一不存在的二进制位。因此实际上就是要判断是否存在 $i<j<k$ 使得 $x \subseteq a_j, a_k$, 这只要 $x$ 的二进制位意义下的次大超集下标,通过子集 DP 转移。注意最后两个位置不可能作为 $i$.

G. Polygons

题意:一个圆内接有 $k$ 个边数互不相同且不超过 $n$ 的正多边形,重复顶点只算一次,求最少顶点个数。

笔记:当 $k=1$ 时答案显然为 $3$. 当 $k\ge2$ 时,首先,若 $n$ 边形被选,且 $2<d|n$, 则 $d$ 边形必然也被选,否则完全可以把它替换成 $d$ 边形,答案不会变劣。其次,如果边数为 $n$ 的因数的所有多边形都被选,那么其对答案的增加量为 $\varphi(n)$. 但是第一次选和偶数例外,因为一、二边形不存在。因为 $\varphi(4)=2$, 所以当 $k\ge2$ 时一定会选中方形,因此只需要让其多选两次,选中一边形(单点)、二边形(一条直径)即可。于是答案就是 $\varphi(1)$ 至 $\varphi(n)$ 中最小的 $(k+2)$ 个之和。

H. Red Blue Tree

题意:树的叶子为红蓝两色之一,有一个参数 $k$, 如果一个中间结点的蓝色子结点个数减去红色子结点个数不少于 $k$, 该点为蓝色,否则为红色。要求实时修改某叶子颜色、查询某结点颜色以及修改参数 $k$.

笔记:首先发现每个结点都有一个临界值,即小于该临界值为蓝色,否则为红色。对这个临界值链分治,对轻子结点建平衡树维护,重链上的变换是求某区间中里子结点的临界值的最近点,这个变换可以合并,线段树维护之。由于删去或加入一个子树,临界值至多改变 $1$, 重链顶端的变换的区间端点可以暴力移动。

posted @ 2019-08-26 12:30  nealchen  阅读(282)  评论(0编辑  收藏  举报