YDSP2023D1BonusB. Yet Another 伟大的数据结构问题
https://www.cnblogs.com/dcytrl/p/18969289 T3。
题意
有 \(n\) 个初始为空的集合,有 \(q\) 次操作:给区间内所有集合插入或删除元素 \(x\),查询集合 \(u\) 是否为 \(v\) 的子集,设此时 \(LIM=||S_u|-|S_v||\),则保证 \(LIM\le 2\)。
\(n,m\le 10^5\)
bonus:\(LIM=3?\)
普通做法
考虑 sum-hash,给每个点赋一个随机权值(范围是 unsigned long long),让一个集合的哈希值为其内元素的权值之和。然后插入元素相当于区间加,删除相当于区间减。如果 \(LIM\le 1\),那么 \(r\) 和 \(l\) 的权值作差就是那个差出来的元素,复杂度单 log。当 \(LIM\le 2\) 时,考虑二进制分组,如果有两个差出来的元素,那么这两个元素在编号上必定存在一位使得一个为 0 一个为 1,枚举每一位,然后只考虑这一位上为 1 的元素的 \(LIM\le 1\),如果差出来了那么我们就拿到了两个差出来的元素的其中一个,另一个也可以拿出来了,复杂度多一个 log。
\(LIM\le 3\),接着考虑二进制分组,同理的,必定存在一位使得三个数在这一位上不同,而且有两个相同,另一个不同,此时能直接拿出那个不同的元素,然后转化成 \(LIM\le 2\)。复杂度不知道会不会多一个 log。
神人做法
这个做法只能做 \(LIM\le 2\)。
\(LIM=1\) 做法一样,\(LIM=2\) 时,考虑差出来的两个数的权值分别为 \(x,y\),如果同时做 sum-hash 和 xor-hash,那么我们能得到 \(x\oplus y=A,x+y=B\),有经典结论 \(x+y=(x\oplus y)+2(x\& y)\),整理得 \(x\& y=\frac{B-A}{2}\)。考虑到 \(x\& y\) 为 1 的位置 \(x\oplus y\) 一定为 0,我们拿这个判断一下,过判了直接算合法。由于 \(x\& y,x\oplus y\) 可以视为长度为 64 的随机 01 串,1 的个数期望在 32 左右,而此时过判的概率约为 \(2^{-32}\),足够低了。一个 log。

浙公网安备 33010602011771号