lxl ppt 学习笔记

学习 lxl 的 nb ppt。

不知道能不能看得下去。

动态分块

经典问题1

区间加,区间小于等于 x 个数。

直接分块,维护每个块的 tag,以及这个块排序之后的数组。

散块直接查,整块在块上二分。

Ynoi2017 由乃打扑克

区间加,区间第 \(k\) 小。

其实就是上面这玩意套个二分。

注意可以把散块提前拼起来,变成一个假的块,查散块的时候在这上面二分,优化一下复杂度。

LG3863

扫描线扫序列,分块维护时间。

就变成了区间加,区间小于等于 \(x\) 个数。

莫队

本质:\([l,r] \rightarrow [l-1,r],[l+1,r],[l,r-1],[l,r+1]\)

AHOI2013 作业

区间 \([l,r]\) 中值在 \([a,b]\) 内的不同数个数。

莫队,值域分块。\(O(n \sqrt n)\)。

Ynoi2016 这是我自己的发明

这题之前模拟赛出过。

首先换根是假的,你可以把一棵子树拆成不超过两段 dfs 序。

然后把它的贡献强行拆成一堆前缀。

BZOJ4241

感觉这题可以用回滚莫队做。

不是很懂值域分块的做法。

哦懂了。

本质不同的答案只有 $O(n) $ 种。

排序处理一下它们的大小关系。

然后记录一下这个状态加一会到哪个,减一会到哪个就行了。

然后用一个值域分块的东西 \(O(1) -O(\sqrt n)\) 就行了。

LG3245

记录一个 \(suf_i\)。

\(suf_i == suf_j(i < j)\) 表示 \(suf_{j} \times 10^{j-i+1} \equiv suf_i (mod \ p)\)。

特判 \(p = 2 \ or \ 5\)。

然后莫队就行了。

区间众数

经典题。

LG3604

考虑一个字符串能排成回文串,要么字母出现次数全是偶数,要么出现次数只有一个奇数。

那么 \(b_i = b_{i-1} \ xor \ (2^{a_i})\)。

记一下 \(b_r\ xor \ b_l = 2^u\) 的方案数就行。

\(O(n \sqrt n c)\),\(c = 26\)。

经典题2

查询区间逆序对个数。

比较 trivial 的算法是莫队之后套一个树状数组。但是这玩意多个 log。

考虑莫队之后套一个值域分块。就能把 log 砍掉了。

莫队二次离线

考虑莫队的每次转移,一定是一个点到一个区间 \([l,r]\) 的答案;。

你把这个区间拆成两个前缀。

然后你做一个序列上的扫描线求出这几个询问的答案。

至于把答案 update 到莫队的过程,就比较 trivial 了。

树上莫队

有个东西叫欧拉序(括号序),大概就是一个点在进入的时候入序一次,在出去的时候入序一次。

在实现莫队的时候,维护一下这个点当前有没有在区间里。如果它没有在区间里,就把他加进去。如果它在区间里,就把它删除。

之后注意一条链的区间。

如果 \(x\) 是 \(y\) 的祖先,那么就是 \([in_x,in_y]\)。

否则,设 \(in_x< in_y\),区间就是 \([out_x,in_y]\)。在这种情况下,要注意 \(lca\) 的括号序是完全包含这个链的,无法被查到。所以你特殊处理一下 \(lca\) 的贡献就行了。

SPOJ10707

上面树上莫队的板子题。

回滚莫队

如果插入操作容易实现,删除操作比较难搞,可以用回滚莫队。

它是用较多的插入来代替删除。

具体实现是把 \(l\) 属于块 \(x\) 的询问都放在一起,然后按照 \(r\) 排序。

如果这个询问属于同一块,就暴力。

否则维护一个 \(r\) 指针,暴力向右跑。

对于每个询问,强制把左端点拉到 \(R_{x}\) ,然后往左加就行了。

经典问题3

查询区间 \(l,r\) 内最小的 \(a_i - a_j\)。

比较暴力的算法是莫队+数据结构,要求支持查询前驱后继。(平衡树之类的)。

正解不是很懂。

正解会了。

一般的回滚莫队是插入比较容易,删除困难。

有一种数据结构叫链表。

所以这题删除比较容易,插入困难。

那么你就把回滚莫队的操作顺序 reverse 一下就行了。

LG5906

上面回滚莫队的板子。

JOISC2014D1T3

也是上面回滚莫队的板子。

BZOJ4358

这题我有一个口胡的算法。

维护一个值域。插入一个数,把相邻的两个区间 merge。

删除的时候,考虑把两个区间删除。

那么这样操作一次,产生的新答案的个数是 \(O(1)\) 的。

直接上值域分块就行。

复杂度 \(O(n \sqrt n)\),默认同阶。

LG5386

\(O(n \sqrt n)\) 的高论是啥啊,不会啊。

考虑把值域 01 标号,回滚莫队。

然后每次 insert 的时候暴力线段树。

复杂度看起来是 \(O(n \sqrt n \log n)\)。

静态分块

在没有修改的情况下,认为静态分块是莫队的子集。

区间众数(LG5048)

太经典了,太 trivial 了。

经典问题4

强制在线,查询区间逆序对。

考虑逆序对的贡献,大力分类讨论。

类似于整块 \(\rightarrow\) 整块,整块 \(\rightarrow\) 散块,散块 \(\rightarrow\) 整块,散块 \(\rightarrow\) 散块之类的。

那么这些个子问题都比较容易。

经典问题5

询问 \([l,r]\) 内最小的 \(|a_i - a_j|\)。

还是像上面一样大力分类讨论。

根号分治

概念没啥好讲的。

经典问题6

给一个图,点权加,查询相邻点权和。

直接对度数根号分治就行了。

经典问题7

给一个序列,给出 \(x,y\) 查询最小的 \(|i-j|\) 使 \(a_i == x,a_j ==y\)。

那么对 \(x\) 的出现次数根号分治。

次数多的就预处理。

次数少的直接归并。

SHOI2006 Homework

那么按照 \(y\) 根号分治。

如果 \(y \leq B\) ,每次就直接更新就行了。

如果 \(y>B\),考虑 \(x \% y = x-[{x \over y}] \times y\)。

那么枚举 \(x \over y\) ,直接值域分块就行了。

Ynoi2015 此时此刻的光辉

那么按照 \(v^{1\over 3}\) 分治。

小的只有 168 个质数,直接前缀和就行了。

大的每个数不超过两个,当场莫队。

后面直接掉线了,有时间再补吧(咕)。

上一篇:dotnet 通过 DockerfileContext 解决项目放在里层文件夹导致 VisualStudio 构建失败


下一篇:极速office2021(PPT)怎么自定义字体颜色