Ynoi

P4688 [Ynoi2016] 掉进兔子洞

序列,静态,求三个区间的可重集的交的大小,离线,\(n,Q\le 10^5\),3s,500MB

点击查看代码 缺乏性质 $\rightarrow$ `bitset`

静态区间 \(\rightarrow\) 莫队化为单点改

bitset 支持取交,\(x\) 重复 \(cnt_x\) 次即可,空间 \(O(n^2/w)\),时间 \(O(n\sqrt n+{n^2\over w})\),分三次处理减小空间常数

P4690 [Ynoi2016] 镜中的昆虫

序列,区间赋值,区间数颜色,离线,\(n,Q\le 10^5\),1s,64MB

点击查看代码

数颜色 \(\rightarrow\) 维护 pre

珂朵莉树 \(\rightarrow\) pre 只改变 \(O(Q)\)

转化:单点改 pre,查询 \([l,r]\)pre 小于 \(l\) 的数量

  1. 树套树,在线,空间 \(O(n\log n)\),时间 \(O(n\log^2 n)\),过不去
  2. CDQ,离线,空间 \(O(n)\),时间 \(O(n\log^2 n)\),正解

P5064 [Ynoi2014] 等这场战争结束之后

图,动态加边,回退到某历史版本,查询某个连通块中权值第 \(k\) 小,离线。\(n,Q\le 10^5\),500ms,20MB

点击查看代码 回退历史版本 & 可离线 $\rightarrow$ dfs 操作树转为撤销

\(k\) 小 & 可合并 \(\rightarrow\) 值域分块 或 bitset

  1. 值域分块

    值域每 \(B\) 个分成一块,按块离线,记录每个连通块点数。

    • 合并、撤销连通块:暴力 \(O({n^2\over B}\log n)\),注意到并查集操作对每个值域块相同,预处理可 \(O(n^2/B)\)
    • 查询连通块第 \(k\) 小:
      • 枚举值域内每个数判断,\(O(nB\log n)\)
      • 每个并查集开桶,\(O(nB)\),空间 \(O(nB)\)\(B\) 需要开很小。
      • 使用链表维护,可以是有序链表归并(难写)或每次把链表所有数拿出来 nth_element\(O(nB)\)

    总时间复杂度 \(O(n\sqrt{n\log n})\)\(O(n\sqrt{n})\),空间线性。

  2. bitset 压位

    查询 bitset 可直接 \(O(n/w)\)

    不能开 \(n\)bitset \(\rightarrow\) 对于点数小于 \(n/w\) 的连通块用链表维护,同时至多存在 \(w\)bitset,空间线性。

    链表查询,合并同上。链表并入 bitset 可启发式暴力。

    总时间复杂度 \(O(n^2/w)\),空间线性。

P5354 [Ynoi2017] 由乃的 OJ

树,每个点的效果为 \(\operatorname{and}/\operatorname{or}/\operatorname{xor}\) 一个数,单点改,询问 \([0,z]\) 中所有数经过路径操作得到的最大值,无需离线。\(n,Q\le 10^5\),值域 \(2^{64}\),250ms,128MB。

点击查看代码 二进制操作 $\rightarrow$ 拆位

二进制复合 \(\rightarrow\) 压位处理复合矩阵,同时处理 \(k\) 位的复合,\(O(k)\rightarrow O(1)\)

总时间复杂度 \(O(n\log^2n+nk)\)

P6109 [Ynoi2009] rprmq1

二维平面,先修改后查询,矩形加,矩形求 \(\max\)\(n\le 5\times 10^4,Q\le 5\times 10^5\),4s,512MB。

点击查看代码 矩阵 $\rightarrow$ 将一维时间化,离线问题转为在线问题

修改,询问在一段时间区间生效 \(\rightarrow\) 猫树转为对一段后缀有效(即修改后无需撤销,询问等价于查历史信息和)

区间加历史最值即可,时间复杂度 \(O(n\log^2n+Q\log n)\)

P6780 [Ynoi2009] pmrllcsrms

序列,单点改,求区间长度不超过 \(c\) 的最大字段和,其中 \(c\) 为全局定值,无需离线。\(n,Q\le 10^6\),6s,512MB。

点击查看代码 长度不超过 $c$ $\rightarrow$ 每 $c$ 个位置分一块,询问分为每块内全部或两相邻块之间

相邻块后前缀长度和不超过 \(c\) \(\rightarrow\) 直角三角形模式,分成一个矩形和两个小直角三角形

时间复杂度 \(O(n\log n)\)

P6783 [Ynoi2008] rrusq

二维平面,\(n\) 个带权点,\(m\) 个矩形,\(Q\) 次询问区间 \([l,r]\) 内的矩形并中点权之和,离线。\(n,m\le 10^5,Q\le 10^6\),4s,128MB。

点击查看代码

静态区间,难以增量 \(\rightarrow\) 扫右维护左

点出现在区间并中 \(\rightarrow\) 扫右端点,维护每个点最后出现时间

KD-Tree,每次暴力收回子树内的出现时间 tag 即可

询问使用 \(O(1)-O(\sqrt n)\) 的数组维护

时间复杂度 \(O(n\sqrt Q+Q\sqrt n)\)

P7446 [Ynoi2007] rfplca

序列,区间减,询问 \(fa\) 数组形成的树上某两个点的 LCA,无需离线。\(n,Q\le 4\times 10^5\),保证 \(fa_i<i\),2.5s,64MB。

点击查看代码 形式奇怪 $\rightarrow$ 考虑分块

询问 LCA \(\rightarrow\) 不断跳 \(fa\)

不断进行重复操作 \(\rightarrow\) 记录每个点跳出块后的第一个位置

散块直接重构,整块 \(\sqrt n\) 次后全部出块,直接打 tag,询问 trivial,时间复杂度 \(O(n\sqrt n)\)

P7447 [Ynoi2007] rgxsxrs

序列,区间大于 \(x\) 的数减 \(x\),区间和与最小最大值,无需离线。\(n,Q\le 5\times 10^5,a_i\le 10^9\),6s,64MB。

点击查看代码

和值域有关 \(\rightarrow\) 值域倍增分块(?)

  1. 块大于 \(x\),打标记或降块,降块至多 \(\log V\) 次,产生 \(\log n\) 的复杂度后必然降块
  2. 块等于 \(x\),暴力找到所有需要减小的 \(a_i\),单个 \(a_i\) 同块内至多减小 \(b\) 次(\(b\) 为倍增底数)

时间复杂度 \(O(nb\log_bV\log n)\)。空间底层分块后线性。

P7722 [Ynoi2007] tmpq

三个序列 \(a,b,c\),单点改 \(a\),询问有几个 \(i<j<k\le r\) 满足 \(b_{a_i}=a_j=c_{a_k}\),离线。\(n\le 2\times 10^5,Q\le 5\times 10^4\),4s,64MB。

点击查看代码 阴间条件 $\rightarrow$ 单点改 $a,b,c$,询问 $b_i=a_j=c_k$

颜色相关 \(\rightarrow\) 次数大小分治,小者暴力,大者维护

小颜色暴力重新 dp,\(O(Q\sqrt n)\) 次区间加,\(O(Q)\) 次单点查

大颜色维护动态 dp,分块维护块内前缀 dp 结果及前缀块 dp 结果,单点改 \(O(\sqrt n)\),查询 前缀块+块内前缀=\(O(1)\)

总时间复杂度 \(O(Q\sqrt n)\),空间离线做到线性

P7880 [Ynoi2006] rldcot

树,边带权(可以为负),静态,\(Q\) 次询问 \([l,r]\) 内的点对有几种不同的 \(\operatorname{lca}\) 带权深度,离线。注意不保证 \(fa_i\le i\)\(n\le 10^5,Q\le 5\times 10^5\),500ms,512MB。

点击查看代码

本质不同子区间计数 \(\rightarrow\) 考虑有用点对

树上有用点对 \(\rightarrow\) 重剖,由轻子树合并上来,有用点对 \(O(n\log n)\)

问题转化为给定 \(O(n\log n)\) 对带权点对,求区间内存在哪些权值。

静态区间问题 \(\rightarrow\) 扫右维护左,转为在线问题

给前缀放上一个颜色,求单点颜色数,树状数组即可。时间复杂度 \(O(n\log^2 n+Q\log n)\)

P7881 [Ynoi2006] rmpq

二维平面,抽象信息,有结合律无交换律,半平面乘,单点查,强制在线。\(Q\le 10^5,x_i,y_i\le 10^9\),操作次数 \(2\times 10^7\),2s,512MB。

点击查看代码 无法 KD-Tree(值域过大且无法离线)。

很想离线(?)\(\rightarrow\) 根号重构。

问题变成预处理 \(B\) 次修改后每个位置的答案。

发现易于用 \(O(k^2)\) 的时间合并两个大小为 \(k\) 的子问题,所以递归两个子问题就可以做到 \(O(B^2)\) 处理。

总时间复杂度 \(O(nB+{n^2\over B})=O(n\sqrt n)\)

P9061 [Ynoi2002] Optimal Ordered Problem Solver

二维平面,将左下角一矩形中所有点投影到矩形上边界/右边界处,查询左下角矩形内点个数,离线。\(n,Q\le 10^6\),4s,512MB。

点击查看代码 思想:所有被操作过的点性质较好,找出每个点第一次被操作的时刻

所有被操作过的点在一条向右/向下的折线上,受查询影响为一段区间(性质好的体现),平衡树维护

问题转为未操作过的点左下角矩形查,三维偏序(\(x_i\le X,y_i\le Y,t_i\le cur\),其中 \(t_i\) 为被操作的时刻)

容斥转走维数:查询左下角 \(\rightarrow\) 查询左边 \(+\) 查询右边 \(+\) 查询右上角

若询问点在当前折线上方则右上角只有两维;若询问点在当前折线下方则本来就为 \(0\)。查询左边右边均为二维偏序。

时间复杂度 \(O(n\log n)\)

P9062 [Ynoi2002] Adaptive Hsearch&Lsearch

二维平面,静态,区间查最近点对,离线。\(n,Q\le 2.5\times 10^5,x_i,y_i\le 10^8\),6s,1GB。

点击查看代码 查最优子区间(点对)$\rightarrow$ 考虑有用点对

平面最近点对 \(\rightarrow\) 网格化思想(对于每个 \(k\) 将平面划分成 \(2^k\times 2^k\) 的网格,每格内点间两两距离超过 \(2^{k-1}\)(否则已在上一层计算),只考虑相邻格之间的贡献)

扫右维护左,\(O(n\log V)\) 次修改,\(O(Q)\) 次查询,由于 \(V\) 较大使用 \(O(1)-O(\sqrt n)\) 平衡,总复杂度 \(O(n\log V+Q\sqrt n)\)


P5313 [Ynoi2011] WBLT

序列,静态,查询给定 \(b\),求最长的“首项 \(<b\),公差为 \(b\),且所有数均在区间 \([l,r]\) 内出现过”的等差数列,离线。\(n,Q,b,a_i\le 10^5\),1.5s,128MB。

点击查看代码 等差数列没有什么好的应对方法。智商不够 `bitset` 来凑。剩下就没什么了。

其实很显然,然后 bitset 没必要开到 \(n\),每次把 bitset 的前 \(b\) 位往后 \(\mathrm{and}\) 即可。当时卡在这里。

\(b\)\(w\) 还小的时候会出问题,每次重扫与 \(b\) 有关的所有询问。

莫队即可。时间复杂度 \(O({QV\over w}+Q\sqrt n+nw)\)

P5046 [Ynoi2019 模拟赛] Yuno loves sqrt technology I

序列,静态,区间逆序对数量,强制在线。\(n,Q\le 10^5\),750ms,512MB。

点击查看代码 区间点对合法点对计数,线段树不可做。

区间内部两两贡献不如一个区间对另一个区间的贡献,容斥:\([l,r]\) 逆序对数 \(=\) \([1,r]\) 逆序对数 \(-\) \([1,l-1]\) 逆序对数 \(-\) \([1,l-1]\) 中大于 \([l,r]\) 的数量

整块对整块的贡献 和 整块对散块的贡献 可以预处理,散块对散块的贡献直接扫一遍归并。(其实怎么做都行,这是 lxl 推荐的做法

时间复杂度 \(O(n\sqrt n)\),空间 \(O(n\sqrt n)\)

P5047 [Ynoi2019 模拟赛] Yuno loves sqrt technology II

序列,静态,区间逆序对数量,离线。\(n,Q\le 10^5\),250ms,31.25MB。

点击查看代码 区间点对合法点对计数,线段树不可做。

离线区间,点到区间的贡献好求 \(\rightarrow\) 莫队。

考虑莫二离,形如 \(O(Q)\) 次查询一个短区间到一个长区间的贡献,短区间长度和是 \(O(Q\sqrt n)\) 的。

短区间到长区间肯定拆成短区间到前缀,然后用和上一题类似的方法解决掉区间内部两点贡献的问题。(其实怎么做都行,这是 lxl 推荐的做法

时间复杂度 \(O(n\sqrt n)\),空间 \(O(n)\)

P5048 [Ynoi2019 模拟赛] Yuno loves sqrt technology III

序列,静态,区间众数的出现次数,强制在线。\(n,Q\le 5\times 10^5\),2s,62.5MB。

点击查看代码 颜色出现次数问题,线段树不可做。~~Ynoi以外的其它地方不大会出现 5e5 根号吧~~

类回滚莫队问题,可以容易区间扩展一位 \(\rightarrow\) 维护块端点到块端点的众数。

判断散块内每个颜色是否能击败整块答案即可。实现上不断检测 \(ans+1\) 是否可行即可,因为至多增加散块大小次。(其实怎么做都行,这是 lxl 推荐的做法

时间复杂度 \(O(n\sqrt n)\),空间 \(O(n)\)

P4117 [Ynoi2018] 五彩斑斓的世界

序列,区间 \(\ge x\) 的数减 \(x\),查询区间 \(x\) 的出现次数,离线。\(n\le 10^6,Q\le 5\times 10^5,a_i\le 10^5\),7.5s,62.5MB。

点击查看代码 不要和 **P7447 [Ynoi2007] rgxsxrs** 弄混了。做法完全不一样。查询颜色出现次数意味着线段树基本不可做。

这题和 ARC149D Simultaneous Sugoroku 很像倒是真的。

关于区间颜色变动 \(\rightarrow\) 必然分块

一次询问只关心一种颜色 \(\rightarrow\) 暴力颜色叠合

类似于折纸,每次只需保证把较短的那部分折到长的部分上即可。

使用并查集维护每个颜色变成了哪个颜色。注意合并的时候一定合并的是两个根节点,所以合并是 \(O(1)\) 的。查询的时候用不到并查集。块内重构的时候把每个点都问了一遍,所以复杂度摊掉了,是不带 \(\alpha(n)\) 的。

按块离线,时间复杂度 \(O(Q\sqrt n)\)

posted @ 2024-01-13 18:49  CharlieVinnie  阅读(65)  评论(0编辑  收藏  举报