2023.12.19 近期练习

发布时间 2023-12-19 19:56:38作者: GloriousCc

CF1835C

先前缀和,找 \([x,y]\)\([l,r]\),使得 \(s_{x-1}\otimes s_y\otimes s_{l-1}\otimes s_r=0\)
因为 \(s_{x-1},s_y,s_{l-1},s_r\) 可以随意交换,如果我们找到了两个区间,我们只需要把相交的部分去掉即可。
所以我们可以随意找两个区间使得他们值相等即可。
发现如果有 \(4\) 个数要确定是很困难的。
但是通过观察数据范围得出,序列的长度的平方恰好是值域的大小,这启示我们用根号算法。
考虑生日悖论,我们每次随机一个区间出来,然后存进 map 里面。
只需要随机 \(\sqrt{4^k}=2^k=n\) 次,所以复杂度为 \(O(n)\)
注意当序列长度小的时候,效率会下降,所以直接枚举就行了。

CF1824C

答案有上限:只需要把每个叶子都修改了即可。
如果能修改一个点,使得多个叶子节点不再需要被修改,那么就赚到了。
考虑从叶子节点往上考虑,如果对于节点 \(u\),其两个儿子 \(a_{v1}=a_{v2}\)
那么就可以修改 \(a_u\),同时,我们可以把 \(a_u\) 看做是叶子节点继续计算。
具体操作的话,设当前处理到 \(u\),维护其子树下还剩的叶子节点的值的个数,用 map 即可。
\(a_u\) 修改为其中出现最多的数,如果赚的话。
如果出现次数最多的不止一个呢?那么把多个都放进 map 里面,并把个数设为 \(1\)
最后特判根节点。