2022.8.20 闲话 — complexity


……?

闲话大定理:闲话是人类为了检验机器人的语言系统创造的东西。

绯色月下、狂咲ノ绝 -1st Anniversary Remix-

绯色月下、狂咲ノ绝 -1st Anniversary Remix-
Vocal:nayuta
Album:East New Sound - Sacred Factor
原曲:东方红魔郷 / U.N.オーエンは彼女なのか?


私の中の私が 私の中の私が
我之中的我 我之中的我
ひとつの単语を
重复着一个单语
何度も何度も何度も
多少遍多少遍多少遍
无尽蔵に
不断重复
缲り返し 缲り返し 缲り返し 缲り返し
重复着 重复着 重复着 重复着
歌う
歌唱

掴む左手が甘くて 震える右手が甘くて
紧握的左手异常甜蜜 挥舞的右手无比甘甜
笑う口が裂けても それがあなたを杀し
笑着的嘴巴已然开裂 随后便给予你杀戮
楽しくて 脳髄を焼くように
快乐得 要刻入脑髓
楽しくて 震えて 楽しくて
快乐到颤抖 好快乐
楽しくて
好快乐

赤い 赤い 赤い 赤い
好红 好红 好红 好红
甘い 甘い 甘い 甘い 甘い 甘い 甘い
好甜 好甜 好甜 好甜 好甜 好甜 好甜
赤い 赤い 赤い
好红 好红 好红
甘い 甘い 甘い
好甜 好甜 好甜
赤い 赤い…
好红 好红…
あなた…甘い…あまぁい
你…好甜…好……甜…………
赤い…あかぁい
好红…好……红…………

『杀してあげる』
「让我杀了你!」

深く朱き润む瞳 甘い色のスカート揺らす
湿润的深红眼眸 鲜艳的裙摆摇荡
幼き頬 朱を渗ませ 疼きに足を崩される
幼小的脸颊浸染朱红 疼痛令双腿都不自由
甘い幻视に支配され 奏でては咲く五指の调べ
被甜美的幻视支配 伸展五指弹奏的旋律
赤い红茶 滴る音 弄んでは 深く抉る
赤色的红茶滴落的声音 玩弄着的是深深的痛苦

「この想い届かないのかな?」
「这份思念无法传达吗?」
「その瞳には谁が映るのかな?」
「那双眼眸映出的是谁?」

「心壊れているのかな?」
「心已经被弄坏了吗?」
「壊れたら戻らないのかな?」
「弄坏后就不能恢复吗?」
「刻む伤は愈えないのかな?」
「受的伤害无法痊愈吗?」
「そうして时を刻むの?」
「这样做能刻画下时间吗?」

あなたのその全てが欲しくて 欲しくて震えてる (この気持ち気付いて どうして気付いてくれないの)
我想要你的全部 想到浑身颤抖(希望你察觉我的心情,为什麽没有察觉到呢?)
甘美なその鼓动を うだち尽くして止めようか (狂気に満ちてゆくわ どうすれば止まるの)
就让那甜美的心跳 竭尽气力就此停止吧(渐渐地被陷入疯狂 无论怎样也无法抑止)
その肌を秽し尽くし 辱めるのは私だけ (この気持ち壊れたて どこへ辿り着くのでしょうか)
尽情弄脏那片肌肤 污辱你的只有我(心情都被毁坏 接着该如何是好)
爱で抚でて揺さ振られて この冲动杀してよ (爱漏れて行くわ 止めることはできない…)
快点平息这份爱抚 和操弄你的冲动吧(爱就要满溢出来 无法停止…)

喉を枯らし叫ウ音色 旋律は朱の虹となり
声嘶力竭歌唱的音色 旋律化作朱红之虹
君屠る此ノ色彩 甘く深き色を放つ
那是屠杀你的色彩 绽放又甜又深之色
喉を枯らし叫ウ音色 赤キ雨に彩られたら
声嘶力竭歌唱的颜色 赤色之雨飞溅四周
绮丽な舞台の出来上がり 私独り其処で踊る
华丽的舞台业已构筑 我独自在其间起舞

「その愿い溃えたのかな?」
「那份愿望破灭了吗?」
「その想い断たれたのかな?」
「那份思念断绝了吗?」

「その希望绝えたのかな?」
「那份希望磨灭了吗?」
「その瞳焼かれたのかな?」
「那份目光燃烧了吗?」
「その肌は秽されたかな?」
「那份肌肤污秽了吗?」
「そして谁もいなくなる?」
「大家都已不见了吗?」

其ノ生を引き裂かれて 赤银を吐き消し飞べ (どこにも本当の 私なんていないのだから)
尽然把这身体撕裂 只有赤银烟雾飞溅(因为哪里都不存在真正的我)
其ノ生の华散らして 极彩に咲き我が粮 (儚い命だわ 美しく爱おしい)
让那身体四分五裂 其艳之色即我食粮(虚幻的生命 美丽又可爱)
其ノ生がお前ならば 喰らい尽くして血肉にす (永远に私のものになるしかない)
如果那具身体是你 我会将肉都吃得干干净净(你只能永远成为我的东西)
其ノ四肢を贽と捧げ 我が足元の死尸となれ (ずっと私の傍に もう行かさないから…)
把那肢体作为供物 让你成为我脚边的死尸(一直在我身边 再也不放你走)

私の中の私が 私の中の私が(この気持ち気付いて…)
我之中的我 我之中的我(希望你能察觉到我的心情…)
ひとつの単语を
重复着一个单语
何度も何度も何度も
多少遍多少遍多少遍
无尽蔵に
不断重复
缲り返し 缲り返し 缲り返し 缲り返し
重复着 重复着 重复着 重复着
歌う
歌唱
(この気持ち気付いて…)
(希望你能察觉到我的心情…)
掴む左手が甘くて 震える右手が甘くて
紧握的左手异常甜蜜 挥舞的右手无比甘甜
笑う口が裂けても それがあなたを杀し
笑着的嘴巴已然开裂 随后便给予你杀戮
楽しくて 脳髄を焼くように
快乐得 要刻入脑髓
楽しくて 震えて 楽しくて
快乐到颤抖 好快乐
楽しくて
好快乐

この気持ち気付いて どうして気付いてくれないの
狂気満ちて行くわ どうすれば止まるの
この気持ち気付いて どこへ辿り着くのでしょうか
爱溢れて行くわ 止めることはできない…

赤い 赤い 赤い 赤い
好红 好红 好红 好红
甘い 甘い 甘い 甘い 甘い 甘い 甘い
好甜 好甜 好甜 好甜 好甜 好甜 好甜
赤い 赤い 赤い
好红 好红 好红
甘い 甘い 甘い
好甜 好甜 好甜
赤い 赤い…
好红 好红…
あなた…甘い…あまぁい
你…好甜…好……甜…………
赤い…あかぁい
好红…好……红…………

『杀してあげる』
「让我杀了你!」

其ノ生を引き裂かれて 赤银を吐き消し飞べ (私のセカイは 绮丽なままでいてほしいから)
就算把这身体撕裂 只有赤银烟雾飞溅(因为想要我的世界永远保持美丽)
其ノ生の华散らして 极彩に咲き我が粮 (想い出が舞うわ 私のものにさせて)
让那身体四分五裂 其艳之色即我食粮(诸多回忆飞舞 成为我的东西吧)
其ノ生がお前ならば 喰らい尽くして血肉にす (ごめんなさい これが最后の爱し方だったから)
如果那具身体是你 我会将肉都吃得干干净净(对不起 这是我最后用来爱你的方式)
其ノ四肢を贽と捧げ 我が足元の死尸となれ (ずっと私の傍に あなたといきたいの…)
把那肢体作为供物 让你成为我脚边的死尸(一直在我身边 我想和你在一起)


UPD. SoyTony 歌

Ticktack

《世界が終るまでは…》

大都会に

仆はもう一人で

投げ舍てられた

空カンのようだ

互いのすべてを

知りつくすまでが

爱ならば いっそ

永久(とわ)に眠ろうか…

世界が终るまでは

离れる事もない

そう愿っていた

几千の夜と

戻らない时だけが

何故辉いては

やつれ切った

心までも 壊す…

はかなき想い…

このTragedy Night

そして人は

形(こたえ)を求めて

かけがえのない

何かを失う

欲望だらけの 街じゃ

夜空の 星屑も

仆らを 灯せない

世界が终る前に

闻かせておくれよ

満开の花が

似合いのCatastrophe

谁もが望みながら

永远を信じない

…なのに きっと

明日を梦见てる

はかなき日々と

このTragedy Night

世界が终るまでは

离れる事もない

そう愿っていた

几千の夜と

戻らない时だけが

何故辉いては

やつれ切った

心までも 壊す…

はかなき想い…

このTragedy Night

このTragedy Night

时间复杂度分析

渐进记号

约定:

  • \(o\) 非渐进紧确上界(类似 \(<\)
  • \(O\) 渐进上界(类似 \(\le\)
  • \(\Theta\) 渐进紧确界(类似 \(=\)
  • \(\Omega\) 渐进下界(类似 \(\ge\)
  • \(\omega\) 非渐进紧确下界(类似 \(>\)

具体内容靠搜索引擎吧 .

常见分析

阶乘

斯特林公式给出了一个阶乘的近似:

Stirling's approximation

\[\boxed{n!\sim\sqrt{2\pi n}\left(\dfrac n{\mathrm e}\right)^n} \]


斯特林公式的证明

前置:

Wallis Formula

\[\dfrac{\pi}2=\lim_{n\to \infty}\left(\dfrac1{2n+1}\cdot\left(\dfrac{(2n)!!}{(2n-1)!!}\right)^2\right) \]

另外一个形式:

\[\boxed{\lim_{n\to+\infty}\dfrac{(n!)^22^{2n}}{(2n)!\sqrt n}=\sqrt{\pi}} \]

Wallis Formula 的证明从略 .

考虑 \(f(x)=\ln x\),以 \([1,n]\cap\mathbb N\) 考虑梯形面积近似积分 .

直接定积分可以得到

\[A_n=\int_{1}^n\ln x\mathrm dx=n\ln n-n+1 \]

然后近似出来的积分就是

\[\begin{aligned}B_n&=\dfrac 12\ln n+\sum_{i=1}^{n-1}\ln i\\&=\ln n!-\dfrac 12\ln n\end{aligned} \]

\(S_n=A_n-B_n\),可得 \(S_n=\ln n^{n+1/2}-n+1-\ln n!\) .

变形得 \(\ln n!=\ln n^{n+1/2}-n+1-S_n\) .

于是 \(n!=n^{n+1/2}\mathrm e^{-n}\mathrm e^{1-S_n}\) .

Let \(T_n=\mathrm e^{1-S_n}\),则 \(n!=T_nn^{n+1/2}\mathrm e^{-n}\) .

为了确定 \(\{T_n\}\) 的极限,考虑 \(\{S_n\}\) 的极限 .

通过一些奥妙重重的方法可以知道 \(S\) 的差分 \(S_n-S_{n-1}<\dfrac1{12n(n+1)}\) .

于是 \(\{S_n\}\) 单增且收敛 .

由比较审敛法知 \(\displaystyle \sum_{i=1}^{\infty}(S_{i+1}-S_i)\) 收敛 .

于是 \(\{T_n\}\) 收敛,设 \(\displaystyle\lim_{n\to \infty}S_n=S\),则 \(\displaystyle\lim_{n\to \infty}T_n=\mathrm e^{1-S}:=T\) .

然后简单计算得 \(S-S_n<\mathrm e^{\frac1{12n}}\) .

于是 \(1<\dfrac{T_n}T<e^{\frac 1{12n}}\),即 \(T<T_n<T\cdot \mathrm e^{\frac 1{12n}}\) .

同乘 \(n^{n+1/2}\mathrm e^{-n}\)(显然这个玩意大于 \(0\))得:

\[Tn^{n+1/2}\mathrm e^{-n}<T_nn^{n+1/2}\mathrm e^{-n}<Tn^{n+1/2}\mathrm e^{\frac 1{12n}}\mathrm e^{-n} \]

然后由我们最初得到的 \(n!=T_nn^{n+1/2}\mathrm e^{-n}\),可以得到:

\[\kern{230px}Tn^{n+1/2}\mathrm e^{-n}<n!<Tn^{n+1/2}\mathrm e^{\frac 1{12n}}\mathrm e^{-n}\kern{210px}(\star) \]

现在我们只需要算出 \(T\) 了!

原式:\(n!=T_nn^{n+1/2}\mathrm e^{-n}\) .
代换:\((2n)!=T_{2n}(2n)^{2n+1/2}\mathrm e^{-2n}\) .

Wallis Formula\(\displaystyle\lim_{n\to+\infty}\dfrac{(n!)^22^{2n}}{(2n)!\sqrt n}=\sqrt{\pi}\) .

将上两式带入 Wallis Formula,可得:

\[\sqrt{\pi}=\lim_{n\to+\infty}\dfrac{T_n^2n^{2n+1}\mathrm e^{-2n}2^{2n}}{T_{2n}(2n)^{2n+1/2}\mathrm e^{-2n}\sqrt n}=\lim_{n\to +\infty}\dfrac{T_n^2}{\sqrt 2\cdot T_{2n}}=\dfrac{T^2}{T\sqrt 2}=\dfrac{T}{\sqrt 2} \]

于是 \(T=\sqrt{2\pi}\) .

带入 \((\star)\) 得:

\[\sqrt{2\pi n}\left(\dfrac ne\right)^n<n!<\sqrt{2\pi n}\left(\dfrac ne\right)^n\mathrm e^{\frac 1{12n}} \]

\(n=\Theta\left(\sqrt{2\pi n}\left(\dfrac ne\right)^n\right)\) .

证完了 .

调和级数

令调和级数 \(\displaystyle H(n)=\sum_{i=1}^n\dfrac 1i\) .

则有 \(H(n)=O(\log n)\) .

证明这个式子需要一些积分技巧,见 https://www.cnblogs.com/CDOI-24374/p/15879221.html .

素数

素数定理:\(\pi(n)\sim \dfrac n{\ln n}\) .


素数倒数和:

\[\boxed{\sum_{\substack{p\le n\cr p\text{ is prime}}}\dfrac 1p=O(\log\log n)} \]

这个大概可以用算数基本定理结合调和级数证明 .

推论:全体合数倒数和为 \(O(\log n)\) .


Riemann Zeta 函数 \(\displaystyle\zeta(s)=\sum_{n=1}^{\infty}\dfrac{1}{n^s}\) .

欧拉乘积公式:\(\displaystyle\zeta(s)=\prod_{p\text{ is prime}}\left(1-\dfrac1{p^s}\right)^{-1}\) .


Mertens' Theoerm: https://arxiv.org/pdf/math/0504289.pdf .

内含

\[\boxed{\sum_{\substack{p\le n\cr p\text{ is prime}}}\dfrac {\ln p}p=\ln n + R(x)\qquad\text{where }|R(x)|< 2} \]

BST

BST:最劣复杂度 \(O(n)\)\(n\) 是树高 .

真平衡树(Splay,FHQ Treap,WBLT):可以提取区间,于是可以实现区间翻转 .

Dynamic Finger Search Tree(一般前提是真平衡树):启发式合并是 1log 的 .

实际上 Splay 随便什么顺序合并都是 1log,具体见 论文 .

Splay 实现 LCT:\(O((n+m)\log n)\) .

分治

直接代入

举个例子:

\[T(n)=2T(n/2)+O(n\log n) \]

首先去掉 \(O\)(最后加回来)然后大力展开可以得到

\[\begin{aligned}T^{\star}&=\sum_{i=0}^{\log n}n\log\dfrac{n}{2^i}\\&=n\sum_{i=0}^{\log n}\log 2^i\\&=\Theta(n\log^2 n)\end{aligned} \]

因为我们还要把 \(O\) 加回来,所以时间复杂度是 \(O(n\log^2 n)\) .

递归树

就画一下每个点转移到哪些点就好了,具体可以整点 DFS 题练练分析 .

Calc

\(n\) 个五元组 \((t_i,a_i,b_i,c_i,d_i)\),从其中选取一些,要求 \(t\) 两两不同,设选取的下标组成集合 \(S\),则 \(S\) 的价值为

\[f(S)=\left(100+\sum_{i\in S}a_i\right)\left(100+\sum_{i\in S}b_i\right)\left(100+\sum_{i\in S}c_i\right)\left(100+\sum_{i\in S}d_i\right) \]

\(1\le n,\max\{t_i\}\le 50\)\(0\le a_i,b_i,c_i,d_i\le 100\) .

暴力 DFS,直接跳过中间不存在的 \(t\),可以发现搜索树规模是 \(O(3^{n/3})\) 的 .

具体画一下就知道了,这个剪枝看起来没啥用但是实际上很强力(怎么 OI 中这么多这种例子).

主定理

Master Theoerm

\(a\ge 1\)\(b>1\) 是常数,\(f(n)\) 是函数,时间复杂度 \(T(n)\) 满足

\[T(n)=aT(n/b)+f(n) \]

其中 \(n/b\) 解释为 \(\lfloor n/b\rfloor\)\(\lceil n/b\rceil\) .

则:

  • 若对某个常数 \(\varepsilon>0\)\(f(n)=O(n^{\log_ba-\varepsilon})\),则 \(T(n)=\Theta(\log_ba)\) .
  • \(f(n)=\Theta(n^{\log_ba})\),则 \(T(n)=O(n^{\log_ba}\log n)\) .
  • 若对某个常数 \(\varepsilon>0\)\(f(n)=\Omega(n^{\log_ba-\varepsilon})\),且对某个常数 \(c<1\) 和足够大的 \(n\)\(af(n/b)\le cf(n)\),则 \(T(n)=\Theta(f(n))\) .

这个直接用就好了 .

简单例子:

  • 二分查找:\(T(n)=T(n/2)+\Theta(1)\Longrightarrow T(n)=\Theta(\log n)\)
  • 归并排序:\(T(n)=2T(n/2)+\Theta(n)\Longrightarrow T(n)=O(n\log n)\)

Akra-Bazzi 方法

原论文

Leighton 改进的 Akra-Bazzi 方法

\[T(x)=\begin{cases}\Theta(1)&1\le x\le x_0\\\displaystyle f(x)+\sum_{i=0}^ka_iT(b_ix)&x>x_0\end{cases} \]

其中:

  • \(x\) 是大于 \(1\) 的实数 .
  • \(i=1\dots k\)
    • \(x_0\) 是一个常数,满足 \(x_0\ge1/b_i\)\(x_0\ge1/(1-b_i)\) .
    • \(a_i\) 是一个正常数 .
    • \(b_i\) 是一个 \((0,1)\) 内的常数 .
  • \(k\) 是一个正整数常数
  • \(f(x)\) 是一个非负函数,且满足多项式增长条件(多项式增长条件:一个函数 \(f(x)\) 若满足 \(|f'(x)|\) 有一个多项式上界,则称 \(f(x)\) 满足多项式增长条件)

\(p\) 为满足 \(\displaystyle\sum_{i=1}^ka_ib_i^p=1\) 的实数(这样的 \(p\) 总是存在),则

\[T(x)=\Theta\left(x^p\left(1+\int_1^x\dfrac{f(u)}{u^{p+1}}\mathrm du\right)\right) \]

这个玩意可以用来解划分不均匀的分治 .

但是难用啊!!!!!!!!

均摊分析 / 摊还分析

摊还分析的两个基本例子:

MULTI 栈

维护一个栈,\(n\) 次操作:

  • PUSH x:加入一个元素 \(x\) .
  • POP:弹出栈顶元素 .
  • MULTIPOP x:做 \(x\)POP

POP 操作时如果栈不空则花费 \(O(1)\) 的时间复杂度弹栈,否则什么也不做(不花费复杂度)

MULTI 栈的三种操作都是均摊 \(O(1)\) 的 .

二进制加法器

维护一个二进制数 \(n\)(注意这个数本身就是 \(n\)),支持 +1 操作 .

+1 操作的实现类似高精度 .

二进制加法器的操作是均摊 \(O(1)\) 的 .

这个是不是非常常见!然后这个也可以扩展到十进制 .


这个非常好感性理解吧:

  • MULTI 栈:你要 POP 必须之前 PUSH 进去吧 .
  • 二进制加法器:进位的次数总是很少吧 .

聚合分析

设操作的总时间为 \(T(n)\),则单个操作的均摊复杂度就是 \(\dfrac{T(n)}n\) .

MULTI 栈总操作次数为 \(O(n)\),这很显然,因为 POPPUSH 的数量必然是相等的,故每次操作均摊 \(O(n)/n=O(1)\) .

二进制加法器的总操作次数为

\[\sum_{i=0}^{k-1}\left\lfloor\dfrac n{2^i}\right\rfloor<\sum_{i=0}^{k-1}\dfrac n{2^i}=2n \]

故每次操作均摊 \(O(n)/n=O(1)\) .

核算法

对于每个操作,证一个代价 \(c\),使得总代价和大于实际总时间 .

MULTI 栈:

如果目前栈容量为 \(k\),则实际价值为

操作名 代价
PUSH x \(1\)
POP \(1\)
MULTIPOP x \(\min(k,x)\)

然后显然可以给 PUSH 代价为 \(2\),然后别的都是 \(0\),这样不难得到总代价和大于实际总时间,于是有实际复杂度上界 \(2n\) .

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

势能分析

势能 Trick 其实出现的很常见:洛谷 P1861 星之器;鞅的停时定理……

引流:时间复杂度-势能分析浅谈,讲得很好啊,感觉我写还不如引流一波 .

练习

还是比较简单的吧!

Fibonacci 数列

递归计算 Fibonacci 数列 \(F(n)=F(n-1)+F(n-2)\) 的时间复杂度是多少?

C++ 代码如下:

int F(int n)
{
	if (n == 1) return 1;
	if (n == 2) return 2;
	return F(n-1) + F(n-2);
}
解答

考虑递归函数的形式,时间复杂度 \(T(n)\) 满足 \(T(n)=T(n-1)+T(n-2)\) .

于是 \(T\) 就是 Fibonacci 数列 .

即时间复杂度 \(T(n)=O(F(n))\) .

双指针

一个长度为 \(n\) 的序列 \(a\),有两个指针 \(l,r\),初始 \(l=r=1\) .

在任意时刻满足 \(l\le r\le n\),每次可能花费 \(O(f(n))\) 的时间将 \(l\gets l+1\)\(r\gets r+1\) .

\(r=n\) 时算法结束,问算法的时间复杂度是多少 .

解答

\(l,r\) 指针均最多进行 \(n\) 次加一操作,于是时间复杂度为 \(T(n)=O(nf(n))\) .

Eratosthenes 筛法

\[T(n)=\sum_{\substack{p\le n\cr p\text{ is prime}}}\dfrac 1p \]

解答

素数倒数和,\(T(n)=O(n\log\log n)\) .

春节十二响

一棵 \(n\) 个点的树,对于每个点都开一个堆,按照 DFS 序每次将子树大小较小的合并到子树大小较大的堆中 .

坏解答

启发式合并思路,每个点最多被合并 \(O(\log n)\) 次,堆的合并是 \(O(n\log n)\) 的,于是时间复杂度是 \(O(n\log^2 n)\) 的 .

解答

实际上上面那个分析根本没有分析到确界 .

实际上这个启发式合并和平常不同,我们考察每个点只会被删除一次,堆里 pop 一下是 \(O(\log n)\) 的,于是时间复杂度是 \(O(n\log n)\) 的 .

轻重链剖分 (HLD)

一棵 \(n\) 个点的树,对于每个节点 \(u\),其子树大小最大的称作重儿子,它们之间的边称作重边,反之称作轻边 .

试分析:对于任意一个点 \(u\),其到根的路径上的轻边数量是什么量级?

解答

走一次轻边子树大小至少除以二,总子树大小是 \(n\),于是轻边数量是 \(O(\log n)\) 的 .

扯淡:一般 HLD 还得套个线段树啥的,形式肯定都是轻边连重链,每个重链做一次 \(O(\log n)\) 的修改,所以单次复杂度是 \(O(\log^2n)\) .

解:

\[T(n)=T(n/2)+\Theta(n\log n) \]

解答 1

主定理直接秒了,\(\Theta(n\log n)\) .

解答 2

首先去掉 \(\Theta\),然后暴力代入:

\[T(n)=\sum_{k\ge 0}\dfrac{n}{2^k}\log\dfrac{n}{2^k} \]

夹一下,首先显而易见

\[T(n)\ge n\log n \]

然后放缩一下:

\[T(n)\le\sum_{k\ge 0}\dfrac{n}{2^k}\log n=2n\log n \]

于是 \(n\log n\le T(n)\le 2n\log n\),即 \(T(n)=\Theta(n\log n)\) .

线性筛 / 欧拉筛

C++ Code:

bool notprime[N];
vector<int> plist;
inline void linear_sieve(int n)
{
	notprime[1] = true;
	for (int i=2;i<=n;i++)
	{
		if (!notprime[i]) plist.emplace_back(i);
		for (auto x : plist)
		{
			int now = i*x;
			if (now > n) break;
			notprime[now] = true;
			if (!(i%x)) break;
		}
	}
}

试分析其时间复杂度 .

解答

每个合数只会被它的最大非自身因数(对应最小质因数)筛一次,于是时间复杂度是 \(O(n)\) 的 .

整除分块(杨卓凡第一小定理)

整除分块问题的嵌套:

比如

\[f(n)=\sum_{i=1}^ng\left(\left\lfloor\dfrac ni\right\rfloor\right) \]

其中 \(g\) 可以 \(O(1)\) 算,这就是一层的整除分块 .

如果说 \(g\) 也是整除分块形式,即

\[g(n)=\sum_{i=1}^nh\left(\left\lfloor\dfrac ni\right\rfloor\right) \]

其中 \(h\) 可以 \(O(1)\) 算,这就是两层的整除分块 .

以此类推,我们可以定义 \(k\) 层整除分块 .

分析一下 \(k\) 层整除分块的时间复杂度 .

解答

杨卓凡小定理 .

首先一层肯定就是 \(O(n^{1/2})\),不知道可以去问由岐 .

两层就是 \(O(n^{3/4})\),非常的经典啊,写一下推导过程:

\[\begin{aligned}T(n)&=\sum_{i=1}^{\sqrt n}i^{1/2}\\&=O\left(\int_{1}^{\sqrt n}(n/z)^{1/2}\mathrm dz\right)\\&=O(n^{3/4})\end{aligned} \]

为什么求和上界是 \(\sqrt n\)?可以问 zero4338 .

三层也是类似的:

\[\begin{aligned}T(n)&=\sum_{i=1}^{\sqrt n}i^{3/4}\\&=O\left(\int_{1}^{\sqrt n}(n/z)^{3/4}\mathrm dz\right)\\&=O(n^{7/8})\end{aligned} \]

然后我们就可以得到 \(k\) 层的整除分块时间复杂度为 \(O\left(\operatorname{pow}\left(n,\dfrac{2^k-1}{2^k}\right)\right)\)(上标太难整了所以记 \(\operatorname{pow}(n,k)=n^k\)),可以数学归纳法证 .

树上背包

\(siz_u\)\(u\) 的子树大小 .

问题:树上背包,子树内最多选 \(k\) 个点,所有点质量都为 1 .

伪代码:

void dfs(int u)
{
	sz[u] = 1
	initialize dp[u]
	for (v is u's son)
	{
		dfs(v)
		for (j : 0 -> min(m, siz[u]))
		for (k : 0 -> min(m-j, siz[v]))
		dp[u][j+k] <- dp[u][j] * dp[v][k]
	}
}
解答

若一个点的子树大小 \(\ge k\),且其所有子树大小都 \(<k\),则称其子树为一个 key subtree .

我们一个一个合并分析,假设目前合并到大小 \(s\),点 \(u\)\(v\)\(u\) 的一个儿子,现在合并 \(u,v\)

  • \(s<k,siz_v<k\),则相当于没有限制,此时一对点只有在它们的 LCA 恰为 \(u\) 时才会匹配,所以就是 \(O(n^2)\) 的 .
  • \(s\ge k,siz_v\ge k\),所有 key subtree 不交,于是至多有 \(\dfrac nm\) 个 .
    实际上这个情况是 \(u\) 已经合并的子树和 \(v\) 中都有 key subtree 的情况,于是合并次数就是 key subtree 个数级别的,合并的复杂度是 \(O(k^2)\) 于是这个情况的复杂度是 \(O(n^2\cdot\frac nm)=O(nm)\)
  • \(s\ge k,siz_v<k\),不难发现就是 \(O(m\cdot\sum_v{siz_v})\),即 \(O(nm)\) .
  • \(s<k,siz_v\ge k\),;类似 .

综合,时间复杂度为 \(O(n(n+k))\) .


如果比较闲可以证一下 min25 筛复杂度 .

Reference


再屯中 V 估计要栈溢出了,所以先 clear 一下:

僵尸舞

《僵尸舞》

今天晚上吃完饭

跑到广场遛个弯儿

一群大妈在跳舞

跟着音乐颠儿颠儿

这个玩意儿挺好玩

伸伸胳膊转一圈儿

反正现在也没事儿

我也来一段儿

平举双手站成排

跟着节奏来摇摆

人们动作很奇怪

就像一群 zombies

突然感觉好害怕

跳的累了想回家

可是身体不听话

还在跳着 zombies

大爷大妈和大叔

快来跳个僵尸舞

非常简单请记住

动作就像 zombies

坚持锻炼身体好

让你永远不会老

所有的人一起跳

我们都是 zombies

音乐全开到最大

失去灵魂你怕不怕

反抗不了就享受吧

到处都是 zombies

反正你也逃不掉

不如和我们继续跳

放弃心脏和大脑

把你变成 zombies

已经感觉很不妙

可我早已走不掉

大家都在对我笑

他们都是 zombies

天色完全黑下来

路上行人都离开

我和世界说 byebye

然后成为 zombies

大爷大妈和大叔

快来跳个僵尸舞

非常简单请记住

动作就像 zombies

那位姑娘你听好

为何拿走我的药

让我忍受这煎熬

永远成为 zombies

请你等等听我说

全部都是我的错

我只求你放过我

我不想变成 zombies

既然来了就别想跑

不如和我们继续跳

放弃心脏和大脑

把你变成 zombies

大爷大妈和大叔

快来跳个僵尸舞

非常简单请记住

动作就像 zombies

坚持锻炼身体好

让你永远不会老

所有的人一起跳

我们都是 zombies

音乐全开到最大

失去灵魂你怕不怕

反抗不了就享受吧

到处都是 zombies

反正你也逃不掉

不如和我们继续跳

放弃心脏和大脑

把你变成 zombies


七重痼病

《七重痼病》

红石蒜在无人之地盛开

妄议着未来 于是溃败

是谁在独享神的偏爱

虽残缺却漠然擦去应有的存在

我想我也爱过

只怪她如何也不听我说

撕开施舍的伪善

才明白连痛觉到底也是虚幻

信仰与绝望深情交缠

灵魂被监牢热切地抱怀

我站在她坠落的高台

静待命运能公正地慈爱地降下审判

尝试对深渊友好

尝试向她跪地求饶

我的声音 这个声音

怨恨的声音 不可以聆听

我的眼睛 这对眼睛

遗忘的眼睛 盲目的载体

内脏间隙 满是崎岖

溃烂的梦境 不存在也许

欺人自欺 终被抛弃

活该去相信 廉价的唯一

光明入侵 恶浊思绪

明媚倒影 执意歪曲

宣讲道义 西凑东拼

忍俊不禁 昭告我的死期

请允许我独自探访这场戏的结局

改写爱的定义

瞻仰我们的遗迹

用所有记忆交换次毫无价值的苏醒

在绝症终末期

重复孤独的空虚

世界已发出信号

停止临终前无止境祈祷

我接受她不在的未来

背叛的神是否依然坚持对我的审判

华而不实的神谕

浸透漆黑的顽疾

轮回因果将安息

现实朝灰色的破晓迫近

在白日中心失去焦距

目之所及怜乞驾凌逻辑认知的康愈

忘却悲哀的言语

零落在冰冷的囹圄


一花依世界

《一花依世界》

飞红遮艳阳

着一身新裳藏半个香囊

轻舟谁在掌

缓些晃涟漪片片怎让梳妆

花桥随波漾

那芬芳慢慢酝酿

载几缕思量

身旁花开满堂盛放水中央

微风吻荷塘

竹篙一点点把时间拉长

待笑靥绽放

就好像胭脂红了脸颊的妆

捧水一把 映着那白云流霞

发着呆欣赏扎起着的髻发

忘了阿妈的话解开了魔法

像是踏入了未来的童话

回转着的陌生影象

好奇的想法从未停下

谁来回答 哎呀哎呀

人来又人往

透过落地窗瞧一眼繁忙

东张又西望

路中央高厦楼房好似盛唐

午后点心坊

蟹壳黄阵阵酥香

绕过陆家浜

松江穿过城隍飘进了心房

像是踏入了未来的童话

左顾右盼眼底风光

好奇的想法从未停下

谁来回答 罢啦罢啦

抬头仰望 夜空多安详

未来过往 同是一轮月光

华灯初上 多想时间停下

给我一生最珍贵的魔法

或许不安 也有过失望

面对未知 总会有彷徨

如果害怕停下了 就不叫做成长

如果希望 是漫天星光

捉个迷藏 世界到处流浪

烟花绽放 多想时间停下

定格这一生最珍贵的刹那

如果希望 是漫天星光

许个愿望 世界充满想象

有太多话藏在心里萌芽

未来想和你们一起长大

posted @ 2022-08-20 17:36  Jijidawang  阅读(182)  评论(2编辑  收藏  举报
😅​