寒假集训杂题选记 2

写在前面

寒假集训期间杂题选记。

CF1288E

知识点:数据结构,乱搞

小清新数据结构。

显然 i 最靠上的出现位置不是 1 就是 ii 最靠下的位置一定出现在 i 即将被扔到顶上前或者所有操作结束之后,且此时 i 的位置即为在它之上的元素的个数。

发现比较难处理的是当某个位置被扔到顶上之后其他元素的后移,但是发现其实并不需要真的显式地将这些元素后移,仅需要维护相对的前后关系,并支持一个前缀的查询即可。

考虑维护一个长度为 m+n 的 01 序列,1 表示该位置有元素。初始时位置 m+1n 为 1;另外维护 posi 表示元素 i 所在位置。第 j 次操作将 i 移动到顶部时,查询 1posi 之和即为 i 此时的排名,然后 posi 置 0,将位置 mj+1 置 1,然后更新 posi=mj+1 即可。

注意还需要在所有操作进行完后对所有元素求一次排名。

总复杂度 O((n+m)log(n+m)) 级别。

P3538 [POI2012] OKR-A Horrible Poem

知识点:哈希,二分,枚举

所有循环节一定是最小循环节的倍数,且 rl+1 一定是一个循环节,于是可以先对 rl+1 进行质因数分解然后对所有质因数进行该质因数的次数遍试除并不断检查试除后是否仍为循环节,即得最小循环节。质因数分解可以通过预处理每个数的最小质因子在 O(log) 级别内完成,于是仅需枚举并试除 log 级别次;然后是典中典结论,若 s[1:|s|d]=s[d+1:|s|],则 s[1:d]s 的循环节,哈希即可判断一段前缀是否为循环节。

[ABC181F] Silver Woods

知识点:并查集

好玩题。

考虑二分答案,检查某直径 d 的圆是否可以无伤通过。发现无法通过当且仅当存在一组钉子,使得这组钉子加上上下界可以构成AT力场把圆挡住。更加形式化地,直径 d 不合法当前仅当存在一组钉子:{(x1,y1),(x2,y2),,(xk,yk)}(y1y2yk),满足:

{|y1(100)|d(xixi+1)2+(yiyi+1)2d|100yk|d

考虑将 check 过程转换成图论问题。新建两个虚拟节点分别代表上下界,若某节点满足与上下界距离不大于 d 则连边;然后枚举所有点对,若距离不大于 d 则连边。若代表上下界的节点连通说明直径为 d 的圆不合法,否则合法。并查集维护即可。

总复杂度 O(n2α(n)logv) 级别。

CF1919D

好玩题,并且学到了维护技巧。

发现相邻的两个数 ai,ai1 有可能代表同一个父亲的两个叶节点,如果这两个数之差为 1 那么一定是同一个父亲的叶节点,则可以把 min{ai,ai1} 删去,相当于把这两个点删去并使它们的父节点变为新的叶节点,再考虑子问题即可。不断重复上述过程后,若最后删得只剩一个数(即根节点),并且 min{ai}=0(存在一条全 0 链)说明有解,否则无解。

然后考虑怎么实现上述过程。发现显然应当按照 ai 降序进行删除操作,若过程中无法继续删下去说明无解。想到用优先队列维护所有节点的 a,用链表模拟删除;但注意到 a 为最大值的点可能有多个且并非其中所有都可以删去,不能直接一股脑扔到队列里。但注意到某个位置之前不能删之后可以删说明删掉旁边一些位置后有了相邻的满足条件的位置,即之后被删的位置要么一开始就能删,要么是某次删数之后相邻的位置,于是先遍历数列将一开始就满足条件的位置扔进优先队列,然后删除某个位置时检查相邻的位置是否满足条件即可。

这个技巧在上次 edu 见过呃呃,还是 suzt 大神传授给我的,太屌了 suzt 大神

总时间复杂度 O(nlogn) 级别。

虽然有线性做法,懒得学了吸吸

写在最后

我是什么几把。

posted @   Luckyblock  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示