SDWC day3 - 序列数据结构
[TOP]
B
路径交。
lxl:然后随便搞搞就好了嘛
线性并查集。
初始全为 0 ,单点修改 1 ,询问一个位置,后面第一个 0 在哪
朴素是 n log n 的。
把序列按 logn 大小来分块,或者 32 大小。
如果一个块里的所有位置都是 1 ,把他向右边合并,否则不合并。
(查询用 lowbit 可以 O(1))
然后这个就线性了。
回到原题,把树按照 logn 大小分块,就可以套上面这个东西了。
C
分块 FFT
复杂度 \(\frac{n}{B} \times \log n + m (\frac{n}{B}+B)\) 。(大概是这样?应该不是)
调整块大小平衡后可以做到 \(m \sqrt {n \log n}\)
lxl 说最优是 \(n \sqrt {n \log n + m}\) 的
UOJ 637
独立计算每个值对答案的贡献,
考虑那些颜色不出现而不是考虑那些颜色不出现
x 有贡献的充分必要条件
所有 x 都在这个区间出现。
找到第一个位置 a 和最后一个位置 b
然后合法的就是 l < a < b < r。
x-1 呢
设有两个 都是 x-1 的 相邻位置(之间没有 x-1)a,b,然后对于 a < l < r < b 也都是合法的
那么我们把 l 看做一维 r 看另一维。
然后就是两个矩形的交,得到的矩形 +1
最后 m 次都是单点查。
BZOJ 3489
区间出现单次的数的个数
枚举所有数然后也可以转换成上面的套路。
比如这里有三个都是 x 的位置 a,b,c,然后对于所有 a < l < b < r < c 所圈成的区间都是合法的。
然后这个玩意转化到二维平面上。就是矩阵加一。
HH 的项链
可以用上面的套路来做,对 n 个矩阵 -1。
经典问题
区间中出现奇数次的数的异或和
顺着异或即可。
UOJ 群里看到是神秘题
区间中出现偶数次的数的异或和
= 出现奇数次的数的异或和 异或上 所有出现过的数的异或和
后者是 HH 的项链带权。
区间子区间问题
给定序列,每次查询区间有多少个子区间满足某个条件。
询问 x,l,r 求所有 [x,i] 区间的值的 min \times max 的和,其中 \(l \le i \le r\)。
(扫一个端点维护另一个端点答案)
设 \(f(i)\) 表示类似于一个单调栈的东西,固定左端点维护的。然后一共只有 n 次修改。
每次给定 l,r, 对于 \(i,j \in [l,r]\),求 \(\sum f(i,j)\) ,其中 \(f(i,j) = \min(a_k, k \in [i,j]) \times \max(a_k, k \in [i,j])\)。
CF997E
给定一个长为 n 的排列,全局(原题是单独的询问)有多少子区间 [l,r] 设 [l',r'] 的最小值为 min,最大值为 max,满足 max - min = r' - l'
max - min - r + l = 0
维护一个二维平面
可以转化成 4n 次矩阵加法。
max 和 min 可以按照上面的套路。
l 和 r 就是对应的行或者列进行矩阵加。
然后用面积并类似的思路求出 0 的个数。
变成单次询问之后怎么办?
看题解。
P3863
一个序列,区间加(可负),单点查历史多少时刻 > x。
很自然的有两个维度,时间维和序列维。
正常扫描线是扫时间维。
我们将其变为扫序列维。
然后修改变成区间加区间减。
询问变成了区间 < x 数的值,分块即可(挖坑,怎么分块?)
Loj3489
有一个长为 n 的序列,序列每个位置有个队列
有 m 个操作
每个操作形如 [l,r] 的每个队列中进来了 k 个 type=c 的人
或者 [l,r] 的每个队列中出去了 k 个人(不足 k 个则全部出去)
还有查询某个队列中第 k 个人的 type (不足 k 个输出0)
感觉这个题的做法和上面这个 P3863 类似。听上去又不那么类似
好像是,
把每次操作映射到二维平面上
扫描线按时间为去扫转变为按照序列维去扫。
之后不会了