2022.07.09 zrNOI模拟赛总结
1.时间安排
8:00~8:20 看题面
T1:构造题,树上点集为子树,对给定两个序列构造对称差小于4e9的排列,送了25分,可能能贪心或者随机化再过个25分。
T2:可能是DP题,给出权值在 \([0, p)\) 的长度为240的序列,询问若干次,构造一组合法的答案是的相加对 \(p\) 取模后等于询问的数,\(p<=1000\)可以直接bitsetdp做,剩下的不是很会,不过有数据随机这一点,可能有乱搞做法。
T3:提交答案题,看不懂题意,放弃。
8:20~8:40
先写了T1白送的25分。
8:40~10:00
写了T2的20分DP。
因为输出要压成16进制,一开始压错了,后来实在没事干写了个spj,发现压缩答案出问题了,改完后没问题。
10:00~11:30
思考也许按照类似重剖的思想,每次贪心的先选重儿子,再递归其他轻儿子的子问题,感觉对称差可能是 \(O(nlogn)\) 级别的,可以把第一个序列构造出来,然后对第二个序列随机调整不超过 \(O(\sqrt n)\) 次,因为一次调整可能会让原来构造的答案多 \(O(n)\),\(O(n\sqrt)\) 应该刚好可以。
但是实际写了代码才发现仅仅是第一个构造就远远超过了 \(O(nlogn)\),后面的随机调整只有 \(O(\sqrt n)\) 次也调整不出什么。
一时想不明白第一个构造为什么不正确,只能把第二个构造改成模拟退火,似乎答案正确了不少。
想了很久突然意识到第一个构造最坏还是 \(O(n^2)\) 的,忽略了兄弟之间的对称差,于是改成按子树大小排序后类似 "根号链剖分" 的东西进行构造,发现答案很接近 \(O(n\sqrtn)\),但是遗憾的是,第二个构造只能想到模拟退火,没有更优的方案了。
11:30~13:00
吃了饭,回来开摆。
result:
T1:25 T2:20 T3:/
2.反思
T1:
双子树莫队?
(待upd)
T2:
非常妙的分块+折半状压好题(思路by larryzhong)
考虑 1e9 的二进制位不超过30个,所以可以分成6个块,每个块放5位,然后用折半状压的方式压出来这个块的值选 0~31 的方案(因为题目保证询问有解),就可以完成构造。
正确性不会证,从感性角度来看这个在40个里面分布5个钦定的位置的概率非常大,加上数据随机,很正确。
实现的时候每个块暴力的部分要尽量小一些,因为数据随机合法态似乎并不多,在匹配的部分加上查询过的剪枝很快就能跑出来。
T3:
\(O(n^2\sqrt n)\) 实现矩乘,不愧是lxl。
(待upd)

浙公网安备 33010602011771号