Ynoi 做题笔记(2024 年暑假)

五彩斑斓的世界 那个题我先暂时不管了。/kk

P9992 [Ynoi Easy Round 2024] TEST_130

自己想了个开头。后面还不会。

之前大概想出来了,但是没想清楚。


发现每次询问 \(w, d\) 就相当于算 \(w\) 子树里离 \(w\) 距离不超过 \(d\) 的点的贡献之和,\(w\) 的贡献是 \(d + 1\)(因为 \(N(w, 0), N(w, 1), \ldots, N(w, d)\) 都可以),\(w\) 往下第一层的每个点分别的贡献是 \(d\),第二层每个点分别的贡献是 \(d - 1\),以此类推。

处理有根树的子树信息,因为有根所以我不会用点分治做这道题,因此考虑 dsu on tree 或者类似的在树上做启发式合并的做法,发现直接算不是很好算。如果每个点的贡献是它到当前子树根的距离就可以方便地做 dsu on tree 或者类似的东西了,因为这样单点的贡献和 \(d\) 无关,而且每次往上移动的时候原来子树里面所有点到当前子树根的距离都会 \(+ 1\),很好维护。

发现容易转化到上面这种好做的题,相当于对一个询问总的贡献就是 \(w\) 子树里离 \(w\) 距离不超过 \(d\) 的点的个数 \(\times (d + 1)\),再减去这些点到 \(w\) 的距离之和。

那么现在有两个问题:

  1. \(w\) 子树里离 \(w\) 距离不超过 \(d\) 的点的个数。
  2. \(w\) 子树里离 \(w\) 距离不超过 \(d\) 的点到 \(w\) 的距离之和。

我之前、刚才想得好像有点问题!dsu on tree 做这个好像是双 log 的,可能可以用平衡树。那好像还不如直接平衡树启发式合并(???)。

然后貌似还可以线段树合并,应该是单 log 的,但看讨论区说常数大。

另外有一个要注意的点,题目有点小瑕疵,给的 d 是可以大于子树深度的,但 d' 是不能大于子树深度的,然而数据范围里没有这个限制。[如果用上面的方法好像要注意 d 和子树深度什么的取 min。](?)

题解区好像有在 DFS 序上跑扫描线用树状数组维护的方法。还没仔细看。

好像是 DFS 序上的位置在某个范围内并且深度在某个范围内?然后就是二维数点?

花欲晚,恣意盛绽

P9991 [Ynoi Easy Round 2023] TEST_107

较简单,自己想出来的。

贪心 + 扫描线 + 线段树。


考虑贪心地只去掉一种数值,那么询问区间会被分成很多段。若有解,那么答案即为每一个可行的段的长度的最大值。

对一种数值,分为三种情况:

  1. 区间左端点到该数值在区间中第一次出现的位置的左边一格。
  2. 区间中挨着(中间无该数值)的该数值夹的区间。
  3. 该数值在区间中最后一次出现的位置的右边一格到区间右端点。

正反跑两遍扫描线来处理。第一遍(正)处理情况 2 和 3,第二遍(反)处理情况 1。用两种线段树来维护,一种是单点修改区间求 min,一种是单点修改区间求 max。

应该是单 log。

纵绚烂,终零落飘散

P5311 [Ynoi2011] 成都七中

中考之前一段时间我把它放在洛谷首页题单里,虽然当时不会做,但一直没舍得移出题单,大概是为了激励自己考上 cdqz 的林荫校区。

当时对七中林荫是非常向往的,毕竟那应该是 SC 最好的高中,[应该也是 SC 打 OI 最强的学校](当时的认知,不知道对不对,但我现在还是这样认为的)。初二下我爸联系了七林的林老师,于是之后的暑假我就去七林跟着他们集训了一段时间。很喜欢那里的环境。但是听课不太听得懂,印象中一起听的人也基本上没多少回答问题的。有“强校联考”(好像是叫这个名字),发现当时 cdqz 的同学们排名整体上不是很靠前,如果只比 cdqz 内部的排名,我甚至还有不算很差的名次。这个时候就很有自信。后来 cdqz 要出题,我刚好学了 LCT,然后就给了个 LCT 的 idea,结果很快它就因为太板被毙了qwq。

后来初三开学了,有一个周末我还去七林做了场模拟赛,发现 [T1](?)和我听人讲过(可能做过)的一道题很像,好像就做出来了。但是后来(初三)因为 whk 的压力我周末就没去 cdqz 了。

大概是初三,因为内耗和对 whk 暂时的厌倦,我的 whk 成绩下降明显,年排也慢慢靠后。这在初三下尤为明显。幸好中考前老师家长同学一起把我从深渊拉了出来。记得中考的时候我的心态是很好而且很稳定的,应该是发挥出了正常的水平。但因为长期的疲倦和懈怠,我当时的能力确实不怎么强,尤其是数学差。最后,我因为 2 分(或 3 分?)之差没有考上 cdqz 的林荫校区。

中考出分的第二天我和爸妈到 cdqz 的高新校区,和教练 hfu 谈了谈,就决定来七中高新了。于是当天上午我就来到了现在所坐的小机房里靠窗的位置。当时 jsh 好像刚讲完高斯消元,我进来的时候有人正在讲莫反,然后我一下就来劲了()。

后来认识了 lr,觉得眼熟。其实之前感觉 hfu 也眼熟。应该是初二下的暑假在七林集训时见过的。

由于这是 Ynoi 做题笔记,不是做题人拿来写无趣的文字的地方,所以我需要写一篇题解:

当然是听了讲又看了题解才会的,但代码是自己写的。


[点分树有一个结论:两个原树上面的点之间的路径一定包括点分树上它们之间的路径上的所有点。](???好可怕,我现在怎么不知道怎么理解它的正确性了,这个结论真的对吗?)

上面这个划掉的东西好像不对,应该是 [两个点在原树上的路径一定经过它们在点分树上的 lca](??)。感觉这是显然的。

于是对于两个点之间的路径,我们可以在它们在点分树上的 lca 处处理。

[扩展一下,对于一个连通块,也一定有一个点满足连通块里所有点都在点分树上它的子树里,并且这个点是这个连通块中的点。应该可以用反证法来证。](??)

补充(虽然在此题中好像没什么用处):[而且根据上面只有两个点的情况的结论,这个点应该就是它所在连通块里所有点在点分树上的 lca。](??)

那么我们就在这个点上来处理这个连通块的信息。那么要求连通块里每个点到它的路径上结点的编号都在 \([l, r]\) 中。于是我们对它在点分树的子树里的所有点求出它们到它的路径上的编号的 min 和 max。现在要做的是求 min >= l 且 max <= r 的点的颜色数。[是二维偏序问题](?),按其中一维排序,做扫描线,用树状数组维护就行了。做扫描线的时候,要注意对于同一位置的询问和修改,询问要放在修改后面。

实际实现上并不需要建出点分树,只需要一遍点分治。感觉这一点比较给人启发,可以从在线结构的角度思考,但用离线的方式解决问题。

[时间貌似是两只 log。](???)

P7906 [Ynoi2005] rpxleqxq

基本上是自己做的,只是写代码之前去看了看题解确认一下。像我这种蒟蒻都会,感觉可以评紫。

不过是有人写道这是莫队二次离线板子我才去做的。可能有了这一点重要提示好做了许多吧。


先考虑一个给定的数异或上一堆数,有多少种结果能 \(\leq x\)。大概的想法是在 01-Trie 上统计,像数位 DP 一样,顶着每一位的上限走,没有顶着的情况就是直接那一棵子树都可以。但是这样时间貌似是 log 的。如果直接莫队就多一个 log,感觉不太行。

考虑莫队二次离线。那么有大概 \(n\) 个修改,大概 \(n \sqrt n\) 个查询。考虑整一个修改根号时间,查询 \(O(1)\) 时间的数据结构。分块!

值域好像是一个 18 位的二进制数。那么我们把前 9 位和后 9 位分开,按前 9 位相同分块,分了 \(2^9 = \sqrt {2 ^ {18}}\) 个块,每个块的块长也是 \(2 ^ 9\)。类似 01-Trie 做即可,具体可见代码。

这样(按位)应该算是一种特殊的值域分块。普通的值域分块相当于把线段树变成块状数组了,而这种按位的值域分块相当于把 01-Trie 变成了块状数组。

时间复杂度大概是 \(n \sqrt n\)(好像不太对啊,因为 \(n\)\(q\) 差别还是有点大。我不太会(普通)莫队的复杂度分析,连块长都是背的())。

P5047 [Ynoi2019 模拟赛] Yuno loves sqrt technology II

学了二次离线莫队后自己做出来的。


二次离线莫队板子题啦,扫描线的时候分块维护一下前缀和就好了。

不过要注意左端点移动和右端点移动算贡献是不同的,动左是找小于它的,动右是找大于它的。

P4887 【模板】莫队二次离线(第十四分块(前体))

板子板子。

时空复杂度我有点不清楚。

有一些要注意的点在代码里面。注意题目允不允许一个点自己和自己造成贡献,如果不允许可能要在跑扫描线的时候特判。如果允许的话貌似莫队的部分还要改一改?

2024.8.29

update 2024.8.30

posted @ 2024-08-29 10:04  huangkxQwQ  阅读(11)  评论(1编辑  收藏  举报