2022.8.7 闲话

8.6 闲话 是我没引流的原因还是放假了没人看了?

《蜘蛛糸モノポリー》

堕ちた世界の終焉で

絶間ない赤を抱く

贖罪を掻き分けて

白蓮の意思は阡年回廊

忽然 視界の中心で

揺れる感情と裏腹に

真直ぐな銀色線は

只 掌で囁いて居た

「…きっと其んな意図なんだ。」

蜘蛛を掴む様なモノガタリ

貴方が何様なんだとしても

救いの亡い莫迦だったとしても

千断れそうな愛の様な"賽"を

手繰り寄せたんだ

其の糸が地獄に照り返る

"赤色"なんだと気付いて居ても

―僕は其れに縋る事しか

出来なかった訳ですから。

堕ちた世界の中心で

絶え間ない夢掴む

ふと底を見下ろす

幾千の四肢が縋っていた

どれだけ伝って来たのか

どれだけ足掻いて来たのか

咽び泣くは血の池の様

蠢き喚くは罪人模様

手を差し伸べた訳じゃ亡いのだろう

貴方は僕が足掻く様を見て

嘲笑っておられたのだろう

かつて僕が"そうした"様に

「…其れでも愛していたんだ。」

蜘蛛を掴む様なモノガタリ

貴方が神様なんだとしても

"救い"と云う釈迦だったとしても

千断れそうな愛の様な"賽"に

しがみついたんだ

其の糸が地獄に照り返る

"赤色"なんだと気付いて居ても

―僕は其れに縋る事しか

出来無かった訳なんだ

貴方が何様なんだとしても

救いの亡い莫迦だったとしても

千断れそうな賽の様な

“愛”を 求めてしまったんだ

『この糸は己の意図だ!』と

叫んで断れた雲の異図 ああ

―僕は其れに縋る事さえ

出来無かった訳ですから


在此放出早就写好的闲话!

定义

笛卡尔树,大概就是序列拉出最值然后左右分治 .

也就是笛卡尔树每个点存两个权值 \((pos,val)\),其中 \(pos\) 满足 BST 性质,\(val\) 满足小根堆性质 .

Treap?

Wikipedia 的图:

建立大概就单调栈维护右链,比较常见,,

例题

RMQ

Largest Rectangle in a Histogram

给一个数列 \(\{a\}\),对于每个 \(i\),求以 \(a_i\) 作为区间最大(小)值的最长区间 .

建笛卡尔树,然后中序遍历,每个节点 \(i\) 的子树的 \(pos\) 最小 / 最大值就是答案 .

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


Beautiful Pair

给一个数列 \(\{a\}\),当一个数对 \((i,j)\)\(i \le j\))满足 \(a_i\)\(a_j\) 的积不大于 \(a_i, a_{i+1}, \ldots, a_j\) 中的最大值时,称其为 Beautiful 的,求 Beautiful 数对数量 .

\(n\le 10^5\) .

每次取当前区间 \([l,r]\) 的最大值 \(a_i\),那么 \(i\) 即为笛卡尔树中此区间对应子树的根节点 .

于是可以平凡笛卡尔树分治,将区间 \([l,r]\) 分成两部分 \([l,i−1]\)\([i+1,r]\) .

枚举小的区间,然后确定另一边要查询的区间以及查询的值,记录下后离线查询,这样问题就是统计 \([l,r]\)\(a_i\le x\) 的数量,直接离线权值树状数组即可 .

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


Max's combining I

给一个序列 \(\{a_n\}\),求

\[\sum_{1\le l\le r\le n}\max_{i\in[l, r]}\{a_i\} \]

这个其实是以前闲话内容(2020.8.2 闲话),我复读一下 .

建笛卡尔树,然后分治一下,用类似 Largest Rectangle in a Histogram 的方法算贡献即可 .

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


Max's combining II

给一个序列 \(\{a_n\}\)\(q\) 组询问,每次给一个区间 \([l,r]\),求:

\[f(l,r)=\sum_{i=l}^r\bigg(\max_{j\in[l,i]}a_j\sum_{j\in[l,i]}a_j\bigg) \]

\(n,q\le 10^6\) .

线段树可以双 log 解此题,这里略去 .

先建笛卡尔树,则发现对于每个询问 \([l,r]\),所有可能的最大值都在 \(l\)\(\operatorname{LCA}(l,r)\) 间的路径上 .

考虑这条路径上的每一个点 \(u\),容易发现,如果 \(u\) 是父亲的右儿子,则没有任何一个 \(i\) 满足 \(\displaystyle\max_{j\in[l,i]} a_j=a_u\)。如果 \(u\) 是父亲的左儿子,那么所有满足 \(\displaystyle\max_{j\in[l,i]} a_j=a_u\)\(i\) 恰好是那些 \(u\) 的右子树中的点 .

于是令前缀和为 \(s_i\),则原式就是 \(\displaystyle\sum_{i=l}^r(s_i-s_{l-1})\max_{j\in[l,i]}a_i\) .

那么拆开就只需要维护 \(\displaystyle\sum_{i=l}^rs_i\max_{j\in[l,i]}a_i\)\(\displaystyle\sum_{i=l}^r\max_{j\in[l,i]}a_i\) 了 .

这个直接做树上前缀和即可 .

预处理 LCA,时间复杂度为 \(O(n\log n+q)\) .


Longest Loose Segment

对于一个序列 \(\{a\}\),若 \(\max\{a\} + \min\{a\}>\operatorname{len}(a)\),则称其为一个 Loose Segment .

维护一个序列 \(\{a\}\)\(q\) 次操作:

  1. 交换两个数 .
  2. 询问 \(\{a\}\) 中最长的 Loose Segment 子串长度 .

\(n,q\le10^6\),2 操作不超过 30 次 .

每次 2 操作重构笛卡尔树然后 DP,对于每个节点 \(u\) 上额外维护一个最长 Loose Segment 子串长度,子树大小和子树最大 \(a_i\) 值 .

然后分讨一下就可以合并 .


Miku HICPK

初始有 \(n\) 个序列,每个序列长度均为 \(1\) .

每次支持拼接两个序列,问每个序列的每个子区间的最小值的和 .

\(n\le 10^6\) .

显然笛卡尔树,则每个点的贡献就是左右子树大小乘积(Max's combining I).

于是我们就需要一个笛卡尔树合并 .

定义关键点为一个树最左边和最右边两个链,则初始关键点只有 \(O(n)\) 个 .

合并 \(x,y\) 时,对于 \(x\) 的右链和 \(y\) 的左链,从最底下开始往上找到第一个能放的位置,这一段长度设为 \(len\),之后这段关键点会被覆盖住,不再存在 .

然后 \(y\) 的这个点左儿子和 \(x\) 的这个点的右儿子进行类似 FHQ Treap 的合并(大概就是 Treap <==> 笛卡尔树 之类的).

由于路径上的点就是两个段的关键点,关键点就消失了 .

于是走的长度就是关键点减少的个数,所以均摊 \(O(n)\) .

从最底下开始找,可以用链表然后链表合并,单纯记录每个点最右边的点也可以 .

子树大小从下往上合并即可,最开始一段链可以用 LCT 同时和笛卡尔树合并做,用于打上标记 .

我也不是很懂这个题,炫啊 .

单调栈(块块)

最大子矩形

一个直方图,第 \(i\) 个高度为 \(h_i\),求最大子矩形 .

等价于找一个点 \(u\) 作为最小值的左右区间,即 Largest Rectangle in a Histogram .


SPOJ PERIODNI

一个长度为 \(n\) 的直方图,第 \(i\) 个高度为 \(h_i\),在上面放 \(k\) 个车,问互不攻击方案数,对 \(10^9+7\) 取模 .

\(n,k\le 500\) .

首先建笛卡尔树 .

把笛卡尔树的一个节点看做一个矩形,父节点的矩形在横坐标上包含子节点的矩形 .

考虑 DP,令 \(dp_{i,j}\) 表示在节点 \(i\) 的子树内放 \(j\) 个车的方案数 .

考虑 \(x\) 对应的矩形中放多少点以及如何放即可,先暴力合并子树信息:

\[p_i=\sum_{j=0}^idp_{\operatorname{lson}(i),j}dp_{\operatorname{rson}(i),i-j} \]

任意模数卷积! 直接暴力维护即可 .

然后处理当前节点对应矩形的转移,设当前矩形长为 \(n\),宽为 \(m\),则:

\[dp_{x,i}=\sum_{j=0}^i\dbinom nj\dbinom{m-i+j}jp_{i-j}\cdot j! \]

这个 \(x\) 看上去没啥用?实际上 \(p_i\) 就隐式包含 \(x\) 了 .

这样时间复杂度就是 \(O(nk^2)\) 的 .

posted @ 2022-08-07 19:52  Jijidawang  阅读(91)  评论(0编辑  收藏  举报
😅​