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 类似。听上去又不那么类似

好像是,

把每次操作映射到二维平面上

扫描线按时间为去扫转变为按照序列维去扫。

之后不会了

posted @ 2022-02-16 17:53  Suzt_ilymtics  阅读(215)  评论(0编辑  收藏  举报