【24noip十连测day1】异或症测试(线性基)

题意

给定一棵带权仙人掌,有 q 次询问,给出 x,y,k,s,并令一条简单路径的权值为路径上所有边的异或和,令 S 为所有 x,y 之前的简单路径的权值所形成的不可重集合,再令 T={x|xS,xands=s},你需要求出集合 T 的第 k+1 小值。

n2×105,q5×104

分析

若图是一颗树,令 sumii 到根的路径的权值,答案即为 sumxsumy

若图是一棵仙人掌,对于 xy 上的所有的环,那么 S 就是 sumxsumy 再异或上某些环的权值构成的集合(表示可以选择走环的顺时针方向和逆时针方向)。不考虑 s 的限制,那么把所有环的权值扔到线性基里,对线性基求 k 小值即可。

考虑询问,把圆方树建出来,并把环的权值挂在方点上,预处理出一个点到根节点的线性基 Ti,每次询问需要将 Tx,Ty 合并,但此时线性基中会有不在链上的权值。考虑可删除线性基的处理套路,每次插入要尽可能的使深度更大,这样查询的时候把深度小于 lca 的那部分扔掉即可。

现在考虑 s 的限制,考虑把原线性基对 biands 在做一遍线性基(注意线性基里存的数是 bi 不是 biands),但这个新线性基有一点不同:新线性基每一位存的数的最高位不一定是这一位,仅仅是这个数在这一位下为 1。根据线性基的性质,新线性基里的所有数能表示出所有的 ands 后的数(原线性基也能)。如果它不能使 val 包含 s,那么就无解。

有几个关于求新线性基的点:

  • 求新线性基中每一位的元素时,可以在原线性基中比这一位更高的元素去找,在该位下为 1 的元素。同时,由于符合条件的数有很多,为了保持新线性基的性质(不能让线性基某一位的数存在与 s 意义下比这一位更高的位使得此数在该位下为 1)。

否则,将新线性基之外的数通过与新线性基里的数异或使得其与 s 互斥(即 xands=0),根据新线性基的性质,我们总是能做到。

然后,我们任意选新线性基之外的数,根据新线性基的性质,我们总能通过异或新线性基里的数使得结果包含 s。所以,能异或出来的数的数量为 2线线

同时,将在新线性基中的数从原线性基中删去,由于此时原线性基所有数不包含 s,所以直接照常做第 k 小即可。

时间复杂度 O(nlogn+qlog2n)

代码:http://zhengruioi.com/submission/793826

作者:dcytrl

出处:https://www.cnblogs.com/dcytrl/p/18405076

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

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