数据结构选练

数据结构题目练习。

I P10690 Fotile 模拟赛 L

首先有显然的 可持久化 Trie,但是暴力是 O(nmlogV),找不到奇妙东西维护,我们就 大力分块,设块长为 B,则我们预处理 prei,j 表示从第 i 块开头到 j 点的最大异或和,复杂度 O(n2BlogV),查询中,对于整块直接拿,对于散块,我们暴力查询,复杂度 O(nBlogV)

总复杂度 O(nnlogV)

代码

II P4587 [FJOI2016] 神秘数

首先我们考虑神秘数的性质,一个集合 S,我们将其排序后从小到大枚举,假设当前神秘数为 now,上次神秘数为 last (若没有则为 0),当前枚举值为 val,则相当于所有值都可以向右平移一段 val 的区间。

  • last+1valnow+1,则平移后的区间可以覆盖到 now,则应该使 nownow+val
  • 否则,平移后的区间一定不可以覆盖到 now,且 S 集合剩余值也不可以,直接结束即可。

上述复杂度是 log(S) 的。

证明:若 last+1valnow+1,则会使 now 至少加 last,则相当于 now 每次扩大 两倍,即复杂度为 log(S)

查询区间 [l,r] 且值域在 [v,u] 之间的权值和,可用主席树解决。

复杂度 O(nlognlog(ai))

代码

III P3247 [HNOI2016] 最小公倍数

首先可以不是简单路径,这启示我们用并查集,但 a,b 的二维限制有些不可做,我们可以先想暴力,对于每个询问只需将所有 aiabib 的所有边加入并查集,并维护最大 a,b 值,判断 u,v 是否在一个联通块内,且最大值即为 a,b,这样可以 O(mqlogn)

限制太特殊了,我们考虑分块,首先将所有边按照 a 排序后分块,每个询问离线下来后把其放到尽量右块内,使所有其左边的块的 a 值都小于等于它,然后我们枚举每个块,将该块询问先按照 b 排序,再将前面的块按照 b 排序,双指针加边即可。

对于在该块内的边,我们暴力枚举加边,枚举后撤销这些操作,所以 并查集不能路径压缩,只能按秩合并。

复杂度 O(qBlogn+m2Blogn),取 B=m 得复杂度为 O((q+m)mlogn)

但是貌似 B=mlogn 跑的最快 : )。

代码

``

posted @   oXUo  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
网站统计
点击右上角即可分享
微信分享提示