做题记录(Jul.)
7.1
P15710
有意思题,但是证明写写画画太长这里就不写了,可以看 题解。
P5290
每个节点用一个大根堆表示答案,有一个贪心策略,合并一个点的所有儿子的子树,然后再把自己加进去,合并方式为每次每个子树都取自己最大的那个放到一起,可以发现不这样选一定不优。
但是暴力这样合并是 \(n^2\) 的,所以我们用巧妙一点的方法,每次合并两个优先队列,把取出来合并好的部分放到一个地方暂存,到一个堆为空时停下,把暂存的扔到另一个堆里。每个点会往优先队列里插入一次,这样合并时每个数只会被出队入队一次,所以是 \(n\log n\) 的。
7.2
CF2211E
首先我们可以只保留每个节点的子树内答案最小时的 \(\gcd\) 向上传递,因为用下面更劣的答案并不会使整体更优。
考虑怎么向上传。注意到一个质因子有一次就够用了,维护一个 \(\gcd\) 中可能存在的质因子的积,那么它可以保证若这条路的 \(\gcd\) 不为一,用这个东西算也可以。用每个儿子和 \(a_i\) 取 \(\gcd\) 再 \(\operatorname{lcm}\) 起来即可,特别注意如果下面的没法上传要直接设置这个点的积为 \(a_i\),答案加一。
CF2207D
还是水题简单。
发现以出发点为根,从上往下,看当前点子树里离他最近的两个叶子,如果两者之间距离小于 \(k+2\),那么可以发现堵上其中一个他就可以走到另一个。所以如果要堵死他,必须堵上当前这个点连向父亲的边,所以假设他是儿子,把这个点的距离向上传。最后如果发现根节点的父亲需要被堵上那就说明可以到叶子,否则不行。
7.3
- 晚上打核桃。
P1758*
著名 trick 管道取珠,但是为什么现在才看。
7.4
CF2183F
和管道取珠一个道理,考虑 \(f_{i,s}\) 表示以 \(i\) 为起点走出字符串 \(s\) 的方案数,则答案为 \(\sum_i\sum_j\sum_s f_{i,s}f_{j,s}\)。令 \(g_{i,j}=\sum_s f_{i,s}f_{j,s}\),那么如果 \(c_i=c_j\) 有 \(g_{i,j}=1+\sum_{u\in T_i}\sum_{v\in T_j} g_{u,v}\) 用 dfs 序和倒着的二位前缀和维护递推即可。
7.5
CF815C(CF816E)
直接 \(f_{i,j,0/1}\) 表示在 \(i\) 的子树里选了 \(j\) 个且 \(i\) 自己用了券。时间复杂度别伪就行。
7.6
CF1628D2(CF1629F2)
省流:先写出暴力 DP,发现确定了前几轮和用了几次加法时选的数是确定的。然后通过组合数优化。
P9410
考虑分块,用并查集维护连通状态和同一连通块里所有散块修改的和,同时维护每个连通块在每一个整块里有几个位置,然后数量乘上整块的标记。这样空间意思是 \(O(n\sqrt n)\) 的,但是你发现实际上有效的记录数量是 \(O(n)\) 的,不必开满,动态搞一搞就行。
7.7
P14321
好题解。
7.8
CF939F
神秘状态,\(f_{i,j}\) 表示到第 \(i\) 个区间结束,当前不在烤的那一面被烤了 \(j\) 秒。单调队列优化 DP。
P3584
神秘贪心。先把选一边之后哪怕平分也比独占另一边强的选掉,然后剩下的就可以按任意顺序看哪边剩的多选哪边了。
P2657 & P13085
梦回初一。
P4124
终于把两年前的做题计划解决了,数位 DP 板子。
7.9
CF1670F
终于见到不那么板的数位 DP 了。
维护二进制位,dfs 时参数为位数,顶没顶满以及要往上一位进多少位。
P3566
感觉策略比较好想的贪心。先放剩的多的,同样多的你就先放结尾那种。
P1248 & P1561
我哪会 Johnson 啊。
7.10
- 打模拟赛。
P14646(A)
省流:无人生还。不是被 corner case 搞死就是写挂了。
发现只要有一个空堆就可以归并,于是考虑没有的话就移走一个大小尽量小的堆然后归并。特别地,初始如果有一个大小为 \(x\) 且是 \(1\sim x\) 的堆,可以直接把其他的归并过来。
P11240(B)
这个简单。最开始不会用 B 操作,于是考虑先看看 A 操作。\(\lfloor\frac{n}{2}\rfloor + 1\) 次,刚好可以把每一组对称的位置判一下吧。但是询问时必须给 3 个数。
先看 \(n\) 为奇数的情况,可以把正中间的那个放进去占位。然后考虑返回值的三种情况:为 \(0\) 说明肯定不同,直接返回 \(0\),为 \(3\) 肯定相同,那就继续。否则,我们发现需要判一下这两个位置和中间的那个相不相同。B 操作就派上用场了,我们把所有结果为 \(1\) 的两个位置放到 vector 里,然后最后一起用 B 操作查一次,返回 \(1\) 说明有和中间相同的,那就不满足了,否则满足。
再看偶数,很类似,但是没有给我们中间位置。考虑拿第一个位置作为固定占位,我们需要特别搞一下它和末尾相不相同。具体方法我们可以考虑 \(n=4\) 时的方案,发现我们可以查询 \((2,3,1)(2,3,4)\),如果结果为 \(0\) 或结果不同则返回 \(0\)。如果为 \(3\) 就不管了,剩下的直接和奇数同理,那就只剩都为 \(1\) 的情况。那我们先和奇数同理搞剩下的部分,并把 \(2,3\) 放进 vector,查询一次 B 操作,发现相同返回 \(0\),否则说明 \(S_2=S_3,S_1\ne S_2,S_4\ne S_2\),那么就可以在查一次 \((1,2,4)\) 看返回值是否为 \(1\),是就返回 \(1\),反之同理即可。
P11252(C)
省流:全员被骗。
发现加一个点之后边数刚好可以造两颗生成树。考虑随便加一个点看看,先把这个三角形和新点给放到两棵树里,肯定放的了,然后往外拓展,发现一个三角形如果被染了一条边,可以给另外两条随意染上不同的颜色,这样就对了。证明比较神秘。
P5410*
Z 函数板子。我调了一年半你知道吗。
7.11
P12923(D)
考虑枚举印章长度,然后去暴力覆盖,发现每次都会取能连起来的最靠后的一个,所以可以发现实际上第 \(i\) 次印和第 \(i+2\) 次印的章一定不会重叠。那么枚举所有长度的印章需要的总印章次数是 \(n\ln n\) 的,可以一个一个印,但是得找到在哪里印。
考虑用 Z 函数找到每个位置和多长的前缀是相同的,同理也可以找到和反串的后缀有多长是相同的。然后枚举长度,用并查集记录每个位置前面最近的能正着或反着印的位置,每次查询,如果长度不够了,就把并查集往前合并。这样最多合并 \(2n\) 次。那么就做完了。
7.13
P3462
神人贪心,难以战胜。
P2168
k 叉哈夫曼树板子。
CF895C*
线性基最简单的应用。分解质因数后表示成 01 串,异或出来是 \(0\) 就是平方数。线性基内的数异或不出来 \(0\),但对于其他 \(x\) 个数的 \(2^x-1\) 种选法显然每种都内在线性基内凑出一种相同的使其异或后为 \(0\),那么答案就是 \(2^x-1\)。
P3265
非异或线性基的板子,但是卡精度。
LOJ #6060*
灵活地运用线性基。很容易想到这个序列的异或和中,二进制下为 \(0\) 的位置肯定是 \(x_1,x_2\) 都等于 \(1\) 时 \(x_1+x_2\) 最大,都为 \(1\) 的位置就是尽量让 \(x_1\) 为 \(0\),\(x_2\) 为 \(1\)。由于后者无论 \(x_1\) 有没有取到 \(0\) 不影响 \(x_1+x_2\) 的最大值,所以我们优先考虑让前者的 \(x_1\) 取到 \(1\),那么我们就可以在线性基中让前者按位从高到低排前面,后者按位从高到低排后面,这样在线性基上贪心的控制 \(x_1\) 就是最优的。
P4151 & CF845G*
著名的线性基应用。可以把问题转换成在路径上异或多个环的异或和。
7.14
CF724G
拆位,对每一位算贡献。令 \(s\) 为线性基大小,如果当前位在线性基中有主元,那么就是对于 \(\binom{n}{2}\) 个点对,有 \(2^{s-1}\) 种选法使得这一位为 \(1\)。若没有主元,那就是这一位为 \(1\) 的数量乘上这一位为 \(0\) 的数量。
CF587E*
奇奇怪怪的线段树错误又增加了。/ll/ll
由于不好区间修改的同时维护线段树上的线性基,考虑转换成单点修改。所以考虑维护异或差分数组上的线性基线段树,只需要每次查出 \(\left[l+1,r\right]\) 上的线性基再把 \(a_l\) 插入进去就行了。
P11620
同上。
P4839
比上面两个简单,直接单点修改就行,而且不用 \(\log^2 n\) 修改,可以直接再那一条链上每个点插入。
CF1100F*
神秘的前缀线性基板子。
7.15
- 打模拟赛。
7.16
- 打 CF。
P15479
什么类比赛状物,太典了。
CF2245
A
先判一下如果 \(k\) 大于一半就无解,然后你从左到右看面朝左的猪猪,能看够就退出,否则转向,右边同理。
B
你发现只要操作次数大于等于一半就能操作,然后你枚举操作次数 \(i\),保留最大的 \(i\) 个数,减去 \(ic\) 就可以了。
D
容易观察到可以把条件转换一下,变成 \(a_x\ge-a_y\) 和 \(a_x<-a_y\),那么显然给每个位置建两个点,一正一负,跑差分约束。不能直接最长路,时间会炸,但是注意到可以缩点,因为零环就是同一个值,不是零环就相当于判了无解。最后拓扑一下,求出每个点的一个相对大小。
然后你发现用 \(f_{i}-f_{-i}\) 就是合法的答案序列。可以从最开始的条件入手,由 \(a_x\ge -a_y\) 和 \(a_y\ge -a_x\) 可得一个 \(a_x-(-a_x)\ge a_y-(-a_y)\),所以把新的这个 \(a_x-(-a_x)\) 当成答案即可,另一种情况同理。
E
依旧博弈。
结论:选的路径上两端度数为奇,中间度数为偶。或者说去掉这条路径后,上面每个点的度数都为偶。
证明很简单,你选完这条路径后,对方选择其上的一个点出发往子树里选路径,肯定也会选必胜的,那么这个时候你就不用顺着它走,而是往这个点连的另一个点的方向选路径。只要你们一人选一个,最后肯定是它没法选。反过来如果你由一个点剩余度数为奇,那就是让对面赢了。
7.17
- 打洛谷比赛。
「FAOI-R13」
A
巴巴博弈。奇数 A 赢,偶数 B 赢。容易证明,赢的一方可以控制到第 \(n\) 轮从 \(n\) 直接跳到 \(0\),而输的人没有机会到 \(0\)。
B
我们依旧称枚举右端点的同时维护对于所有左端点的答案的东西叫类比赛状物。
比比赛好维护,只需要维护 \(\log\) 段或和就可以了。
7.18
- 打模拟赛。
7.19
- 打 ARC。
AT_arc225
A
搞出一种和原来的颜色一一对应的方案就行了。
B
神秘结论的博弈,只有每个连续 \(1\) 的段都长为 \(2\) 才是后手赢。
D
输出 \(\frac{\sum |p_i-i|}{2}\)。
7.20
P6963
路径长度从大到小排序,然后依次放到路径上。如果被之前的路径完全包含或不交就行。
判断方式就是把这条路径染色,然后新路径看一下路径上的颜色是否全部相同。树剖即可。
P1290
巴巴博弈,通过状态转移图或者手玩都可以发现,第一个遇到 \(\frac{x}{y}\ge 2\) 的人赢。如果最后没人遇到,那就顺其自然就行。
7.21
P3185
巴巴博弈,注意到每个石子独立,所以我们可以求每个位置的石子的 SG 函数,求法就是枚举石子分裂到哪两个位置,把这两个位置的 SG 异或起来,然后取所有这样的值的 \(\operatorname{mex}\)。
P4363*
蒟蒻第一次做轮廓线 DP。
7.29
P4551
假期结束了复健一下。Trie 树的简单应用。
7.30
P8511
先考虑全局的最大点对。不是这两个点的祖先的点的答案都是这两个点异或。
考虑从根到这两个点的链,在往下的过程中把其他子树放进 Trie 统计答案即可。
P6072
在上面这题的基础上,多算一个子树内选两个点的答案。\(n\) 不大,dsu on tree 即可。
P10031
注意到 \(\gcd(n,i)=\gcd(n,n-i)\)。
P8255
对于每个质因数出现的次数 \(c\),当 \(3c_x\le c_z\) 时,有 \(c_y=c_z-2c_x\),当 \(3c_x>c_z\) 时,有 \(2c_y=c_z-c_x\),那么可以写成一个式子:$$c_y=\frac{2c_z-c_x-\min(c_z,3c_x)}{2}$$
转换回数字,则有 $$y=\sqrt{\frac{z^2}{x\gcd(z,x ^3)}}$$
不是整数就无解。

浙公网安备 33010602011771号