幻影彭的彩虹

寻遍这星空

网络文娱推荐

随便写写自己喜欢的东西,顺便安利给其他人,主要是网络小说,也有其它的,看心情加。

网络小说

乱序排列。

故事向

以故事情节为看点。

星体意识

把这个归入故事向其实有些不妥,但非故事向也不妥,勉强了

来自 "刺猬猫" 平台,以岚星文明发展史为主线。

半风景文,有大量描写内容完全可以借鉴到语文写作中。

伪群像文,记录了文明每个时期重要正面人物的经历,有相当的励志成分。

作者自身的计算机技术水平相当不错,通过小说外的创作真正构建出了一个岚星宇宙。

舰娘世纪

来自 "刺猬猫" 平台,不一样的舰娘故事,相对沉重一些。

化身虚拟数据歌姬

来自 "起点中文网" 平台,算是我的二次元入门小说。

其实这本书现在看来还是有很多不足,作者自身文笔欠佳,故事大纲也不清晰,但是还是放在这里吧。这位作者和我同龄,也比较熟。我还给书中主角设计了一个基于 beta.character.ai 模型的 AI 角色(目前正在训练以及写配套平台的代码)。

鹿灵第一可爱啦。

非故事向

能够让人思考的书。

数竞少女

来自 "刺猬猫" 平台,主要内容是架空世界中的数学竞赛。

阅读时备好草稿纸跟着一起算,基本是高考到一式难度的题,偶有简单的二试题,做不了可以往下看。

二战之钢铁奏鸣曲

来自 "息壤" 平台,以架空世界中的二战经济政治,武器设计为主线发展。

阅读时需查阅历史资料,也可以跟着武器设计思路(尤其是航空航天部分)简略思考其物理原理,需要一定流体力学基础。

斗罗活久见

来自 "起点中文网" 平台,感觉名字会比较劝退,但这并不是一本故事向的书,以文明发展为主线,包含大量脑洞和搞笑内容。

阅读时不要拘泥于它的故事情节,请关注这个文明是如何在所有人的努力下发展的,更要关注其中提到的科学探索的方式。

向往,坚毅,牺牲。这三个词贯穿了郁金香文明的发展历程。

一个个渺小的个体摸索着宇宙的真理,亿万人同心,同宇宙的掌控者对弈。

1700 章之后由于作者要恰钱稍有变质,太过理想化了,放在这里的理应只有前 1700 章。

顺便提一下,作者的其他书也很不错,也是同一类的。

作者 ID 有三个:印小宇,印小桢,魔性沧月。

有些太热门的只是单纯喜欢听就不写了

纯音乐

基本收录的是那种能让人平静下来或者热血起来的纯音乐,治愈系为主。

  • 繁华的寂静
  • illusionary daytime
  • 流萤之森
  • 青空
  • 风动草
  • 萤火虫之舞
  • Windy Hill

非纯音乐

如果我们不曾相遇

学校起床铃的歌,很喜欢它的歌词。

很想念我的同学——LXY。

偶尔听到歌的时候会流泪的。

无论如何,祝你 17 岁生日快乐。

如愿

原定 12·9 合唱的歌。

它提醒我还得向前看,喜欢的合唱 MV,那是这个国家或者说文明中所有个体的缩影,如果问我学习的目的是什么,我的回答是,成为这个 MV 的一部分。

可惜最后我们都没有合唱出来。

飞-致我们的星辰大海

来自 《斗罗活久见》的推荐,和这本小说一样的主题,这是我们的星辰大海,也是郁金香文明的星辰大海。

1124总结

考试

T1

\(n\) 个类似的条件,考虑容斥原理,条件可以被描述为 \(\forall i\in[1,n),a_i\nmid a_{i+1}\vee a_i=a_{i+1}\)

容斥原理需要计算,钦定 \(x\) 个条件不成立,忽视其它条件时,合法的方案总数。

假设我们已经钦定好了 \(x\) 个条件,那么很容易计算出这个方案,将每一段连续的不合法的位置的方案数计算出来,其余位置不受限制即可,就是 \(m\)

每一段连续不合法位置的贡献显然仅和长度有关,而长度又不超过 \(\log n\),所以可以预处理一个 \(g[x]\) 表示连续 \(x\) 个连续不合法位置的贡献,注意到不合法位置开头的前一个位置也是需要考虑进去的,但它没有限制,所以连带算进去就行。

预处理的时候进行 \(dp\),可以记录上一个位置的值。

计算出 \(g[x]\) 后,我们不需要死板的去考虑有 \(x\) 个位置不合法时,它们的分布是什么,如果这样考虑,那么每一个 \(x\) 都需要进行一次动态规划来计算答案并乘上容斥系数。

我们可以用一次动态规划完成整个统计过程。

\(dp[i]\) 表示考虑前 \(i\) 位,各个容斥统计子问题带上对应系数后的答案之和,它向后的转移很简单,容斥系数乘上不合法位置填法的系数。

从一般的动态规划思路也可联想到这种方案,其实末尾数字是一个多余的信息,可以不用记录,用容斥的思想即可正确转移,直接设 \(dp[i]\) 表示考虑前 \(i\) 位的答案。

\(dp[i]->dp[i+1]\),可以任意填,有算重。

考虑钦定 \(dp[i]->dp[i+1]\) 这里不合法,那么减去 \(dp[i-1]*(i\ 到\ i+1\ 不合法的方案数)\)

发现减多了,因为 \(i-1\rightarrow i\) 时不合法的也被减掉了,但这一部分贡献根本在第一次就没加上。

继续推下去和容斥的思路也完全一样了。

容斥原理的统计过程,是可以用动态规划来完成的,注意转移时需要带上容斥的系数,相当于把不同的不合法条件数的统计过程压缩到了一次,带上容斥系数就是压缩信息的过程。

T2

T3

My Method

将差分数组的所有值视为一个集合。

它本质上需要计算第 \(k\) 大元素的期望。

很容易想到min-max 容斥,问题变成了计算一个差分数组集合子集最小值的期望值,考虑怎么算一个子集最小值的期望值。

假设子集为 \(S\),枚举最小值的取值 \(x\),然后问题变成了有多少个长度为 \(n+1\) 的序列 \(a\),满足 \(a_i\ge 1,\sum a_i=m+1,\forall p\in S, a_p\ge x\),这是一个先把 \(S\) 中所有元素的限制变成 \(\ge 1\),方法是把 \(\sum\) 变成 \(=m+1-size(S)\times(x-1)\),剩下的是个插板法。

因此对于大小相同的子集这个值是一样的。

\(val_k\) 表示大小为 \(k\) 的子集,最小值的期望。

接下来可以直接套 min-max 容斥的公式,但是我背不住那个公式,于是考虑比较暴力的方式,考虑所有大小为 \(n-k+1\) 的子集的期望最小值的和。\(k\) 小值贡献了 \(1\) 次,\(k-1\) 小值贡献了 \(\binom{n-k+1}{n-k}\) 次,\(\cdots\),边界是最小值,一路推上来就行。

复杂度 \(O(nm+n^2)\)

Talentkk's Method

Solution

min-max 容斥

T4

\[ (\dfrac{\alpha v}{\beta v})_T=T(\frac{\alpha p}{2 T})_v - P \]

CSP2022考试总结

T1

先想到动态规划,但是想了下不好处理不相同的要求,发现只有 \(4\) 个点,考虑利用这个性质。

枚举中间的两个点,然后判断是否合法,然后对于每个点预处理到 \(1\) 可能的中间点,取值最大的 \(3\) 个,然后就可以直接合并两个点的信息得到一条路径。

T2

容易发现只会在 \(A,B\) 每个区间中的四个数中选,即负最大最小,正最大最小。

一共 \(16\) 种方案,直接拿个数据结构维护信息,暴力合并计算答案即可。

T3

考场暴力

不难发现充要条件是每个点有且仅有一条出边,这个条件相当严。

考虑只在边数为 \(n\) 时进行检查,其余情况显然是 NO,边数为 \(n\) 时,对所有被修改过的端点下放操作,此时 \(2,4\) 操作可能会叠加,只处理最后一次即可。

这样的暴力很难卡,实际上也可以通过。

正解1

充要条件是若干个类似的条件的叠加,考虑能不能一起检查。

CF某道题

参考这道题的思路,可以随机一个集合检查这个在集合里的所有点的边数和是否等于集合大小。

考虑不合法的 Case 通过判定的概率,显然不会超过 \(\frac{1}{2}\),证明可以考虑一个不合法的元素所有能够通过判定的集合,如果包含它,那么删去它后就不合法,如果不包含它,那么对应加上它后就不合法,构造出等量的不合法集合,因此通过判定的概率低于 \(\frac{1}{2}\),所以做 \(2\log_2(q)\) 次就能保证正确,如果还错了,快用你生成的第一个随机数去买彩票!

正解2

问题的本质是维护集合,你需要维护 \(n\) 个可重集,支持加入删除,填满和清空,问 \(n\) 个可重集的并是否等于某个集合,可以考虑 xor_hash

随机点权的情况下,一个可重集的权值也是随机的,所以正确率为 \(1-\frac{1}{值域大小}\),注意仍然需要特判边数是否为 \(n\),因为可以构造不同大小的对于 xor_hash 来说权值相同的可重集——某一个元素出现 \(3\) 次,其余元素次数相同。

只有错误出现在不同元素之间互补构造时,xor_hash 的正确性才有保证

T4

考场暴力

可以把链提出来动态规划,期望 \(68\),场上第一次写没考虑往一个点旁边走可以更优,只能过 \(k\le 2\)

修了这个锅之后由于第一次写的时候限制了步数,但是走旁边会消耗步数,导致最开始没有办法走旁边,然后娶不到最优解。

正解

把暴力的动态规划改成倍增版即可。

有点难写,暂时没写。

1122总结

考试

T1

有趣的题。

场上瞎撞结论显然是错误的。

考虑 \(01\) 矩阵乘法的组合意义,就是统计一张图从 \(S\)\(T\) 某个长度的路径总条数。

所以如果不存在长度为 \(k\) 的路径,考虑将点按照最长路径长度分类,每一类需要尽可能均分。

然后每一类内部不连边,和向外部路长度更短的所有点连单向边。

考虑证明这样的边数最多,问题本质是有 \(k\) 个变量 \(a_1,a_2\cdots a_k\) 满足 \(\sum\limits_{i\in[1,k]}a_i=n\),求 \(\sum\limits_{i\in[1,k]} \binom{a_i}{2}\) 的最小值,列式计算: \[ \begin{align} \sum\limits_{i\in[1,k]} \binom{a_i}{2}=&\dfrac{a_i\times(a_i-1)}{2}\\ =&-\dfrac{n+\sum\limits_{i\in[1,k]}a_i^2}{2} \end{align} \] 考虑证明分布在 \(v=\lfloor\frac{n}{k}\rfloor\)\(\lfloor\frac{n}{k}\rfloor+1\) 之间的 \(a_i\) 是最优的,假设不为这两个值,那么找到两个值 \(x<v\)\(y>v+1\),将 \(x\) 调整为 \(x+1\)\(y\) 调整为 \(y-1\),那么从 \(x^2+y^2\) 变成了 \(x^2+2x+1+y^2-2y+1\),由于 \(y> x+1\),所以一定会变优,如果只能找到 \(x\) 或者 \(y\),就对应的选择 \(v+1\)\(v\),同样会变优,调整到最后就分布在 \(v,v+1\)

不直观的计数问题,考察其组合意义,变成直观的计数问题。

T2

很容易想到二分,直接二分的复杂度是 \(O(nq\log^2 n)\) 的。发现 \(check\) 的代价和二分值有关,考虑调整二分策略,尝试以 \(O(ans\log ans\log n)\) 的代价找出一次清空,发现倍增后二分即可。

T3

朴素的动态规划是 \(O(n^5)\) 的,配合性质的暴力可以有 \(50\)

观察,发现答案不会很大,考虑改变动态规划状态,设 \(dp[x][y][i][ans]\) 表示左端点为 \((x,y)\),横向延伸到 \(i(i\ge x)\),纵向延申的最远位置,不难发现该状态有单调性,即 \(dp[x+1][y][i][ans]\ge dp[x][y][i][ans]\),因此纵向转移是简单的,可以做到 \(O(1)\),转移完之后其实就已经单调了,不用前缀 \(\max\)

考虑横向的转移,不难发现最优的转移点单调,且答案递减,维护这个最优转移点即可。

T4

朴素做法

考虑设 \(dp[i][j][k]\) 表示考虑到第 \(i\) 个数,抹掉了 \(k\) 位后再加上了若干位,最终的 \(\log_2\) 值为 \(j\) 的最小方案。

视实现有 \(40-75\),转移是一个前缀 \(\min\) 加上一个带判断的转移。

不太需要动脑子的办法

转移可以通过类似双指针的方法做到均摊 \(O(1)\),考虑优化状态数。

有一个显然的可行解需要 \(\sum\log_2{a_i}=sum\) 步。

考虑每一个位置 \(k\) 的上界,设 \(T=\log m \approx18\),那么如果一个位置 \(i\)\(j\) 的状态如果满足了 \((j-T)\times(n-i) \ge sum\),那么这个 \(j\) 是没有意义的,这样限制下来 \(j\) 这一维是 \(Tn\ln n\) 大小的。

已经可以比较险的通过了,其实还有一个限制,就是 \(lim_i\le lim_{i-1}+1\),原因是显然的,加上这个限制之后又会变松很多。

最后记一个 \(mn\) 表示当前状态的最小可能值,条件变为 \((j-T)\times(n-i)+mn \ge sum\),就很容易通过了。

场上前缀最小值只取了上一个位置的,挂了。

比较聪明的办法

考虑如果 \(a_i'\) 变到了 \(\log_2\ge 17\) 之后会发生什么,它之后的位置的 \(\log_2\) 值,都必须要大于 \(17\),不妨先在这些数后面添 \(0\) 补到 \(17\),进行代价的预付,到一个位置的时候,我们已知它和上一个位置的 \(\log2\) 已经相同了,只需要改变高位的一些值,这样的改变方式只有 \(\log n\) 种,代价也是好算的,暴力枚举就是 \(O(n\log^2n )\) 的,如果会导致后面的位置的 \(\log_2\) 变大,就在这里预付代价。

本质上,这种方法通过分析 \(j\ge 17\) 后最优解 \(\log_2\) 值的变化,得到了一种新的代价计算方式,这种方式不依赖 \(j\),减少了状态数量

同一个最优化问题,可以采取不同的代价计算方式,得到不同的动态规划状态。预付代价是一种常用的方式。

典型例题是《任务安排》。

1119

考试

挂大分

T1

蠢做法

对于每一行,检查有哪些位置对是合法的,如果序列已经有序,那么先扔到后面去。

不难发现每一行合法位置对数是 \(O(n)\) 的,set 处理集合求交即可。

由于处理的是无序对,但 set 是有序的,所以要把正反都插进去。

局部数组不要越界

n,m 不要写反

优秀做法

考虑将某一行排序,看看有变化的位置。

这样的位置有且仅有两个,检查一下每一行的变化位置是否会相同就可以了。

优先处理有变化的行。

T2

首先发现 \(B,C\) 等价,变成 01 串问题,每一个 \(0\) 的前面是自由的,可以自由控制 \(1\) 的个数,\(0\) 不可减少,\(0\) 的增加。如果 \(T\) 的末尾为 \(1\),那么 \(S\) 的末尾需要对应有那么多的 \(1\),将这些抵消,\(T\) 的末尾就是 \(0\)

分类讨论,如果 \(S\) 的末尾的 \(1\) 模三不余 \(0\),那么还需要添加两个 \(0\),此时如果 \(0\) 多了或者模 \(2\) 不相同则无解,否则有解。

有边界情况,如果 \(S\) 中本来没有 \(0\) 并且 \(1\) 也被抵消完了,那么不能额外的生成 \(0\)

我实现的时候计算连续 \(0\) 个数的时候没有考虑左边界,还挂了一下。

T3

题意轻重边,见 树上领域修改问题

T4

n^2

如果 \(O(n^2)\),那么考虑以插入的方式构造排列,已经是一个被积累起来的套路了,场上成功写出。

nlogn

1117总结

考试

T1

问的是对于每个跳棋能走到多少个格子,不重不漏那种。

发现对于一个棋子,由于它跳的时候其它的不能动,所以本质上如果弄成图处理不会出问题,问题变成了无向图中一个点可以到多少个点,就是联通块问题,不妨先把所有可能可达的点弄出来建一个图,点数 \(O(n)\),然后问一个棋子,要对图做一下改变,具体的是加一些边连向一个新点,问新点所在连通块大小。

可以可撤销并查集,当然也可以直接枚举做,相邻的情况是平凡的,特判掉。

场上写挂是因为数组开小了,点的数量是 \(7n\) 而不是 \(6n\)

T2

首先判掉没有 \(GT\) 的情况,直接选最后一个。

然后如果有 \(GT\) ,那么一左端点一定是第一个 \(G\) 或者 \(T\),然后左端点固定,需要比较 \(O(n)\) 个字符串,每个字符串可以描述为两个字符串的子串拼起来,然后用二分哈希比较就可以了。

场上拼串的时候多弄了一个字符, \(90\)

T3

暂时还不会

T4

考虑建图,图本身很类似一棵树,因为合法括号序列本身就是树的结构,将一对括号视作树上的一个节点,这个节点中含有两个子节点,那么连边就是一个节点中的两个子节点连边以及儿子的左右两个子节点之间连边,以及最左最右的儿子向对应的父亲子节点连边。

然后任何路径必须在 LCA 处交汇,变成树上路径问题,可以倍增。

注意因为我们实现的时候建了一个虚拟节点,实际上不能走它,需要特判。

心灵现实

注意,以下内容为纯属虚构

思维速度

解决问题

如果一个机器 A,可以模拟机器 B,并且机器 B,可以模拟机器 A,则称 A,B 在解决问题上的能力等价。

如果机器 A,可以模拟机器 B,但机器 B,不能模拟机器 A,则称 A 比 B 在解决问题上更强大。

人脑可以模拟图灵机,但图灵机暂时无法模拟人脑,所以人脑解决问题的能力比图灵机更强大。

质因数分解

对于大数的质因数分解,计算机科学界暂时还没有找到关于位数的多项式算法,尽管一些指数级算法非常优秀,在个人计算机上都可以在一秒内完成 \(2^{80}\) 以内的质因数分解,但它终归不是一个关于问题规模多项式算法。

大数质因数分解问题本身的困难性,催生了大批基于这个问题的加密算法,例如 RSA 加密,只需要选取 2048 位的 N,就可以保证人类现有的算力在宇宙末日时都无法破解出私钥。

根据国家计生委未公开的大数据统计,平均每 66666666 位少年少女中就有一位这样的天才,心算能力极为恐怖,可以在线性复杂度内分解任意长度的大整数,因为时间瓶颈主要在于把结果用笔写出来。中国科学技术大学少年班学院成立的主要目的,其实就是为了网罗这样的神童。

没有元素周期表的化学

现在的脑科学,是在黑暗中摸索,如同没有发现元素周期表之前的化学。我不知道现在的脑科学探索是什么样子,但我很清楚没有发现元素周期表之前的化学是什么样子。

​ ——black_white_tony

神经网络算法是图灵机语言对人脑的一个粗略模拟,在一些领域上取得了重要成果,但基于神经网络算法的人工智能,表现则令人相当失望——它们在有引导的情况下,可以尝试并解决一些有相当难度的题目,但一旦失去引导,又会变为一个“全知的愚者”。

我可以断言——在脑科学没有重大突破前,人工智能不会有决定性的突破。

拉普拉斯妖

流体力学的研究对象是混沌系统,很大一部分问题根本没有解析解,只能靠猜测解决。

但法国数学家拉普拉斯妄图通过一个理论上的怪兽来计算宇宙的状态,很核心的一个问题就是它计算过程本身也需要被纳入考虑,考虑计算过程本身的过程是一个无限的递归,它是否收敛,还没有一个定论,也许它是一个这样的过程: \[ 1+\frac{1}{2}+\frac{1}{4}+\frac{1}{8}+\cdots=2 \] 也有可能在达到宇宙的某一个极限后(例如普朗克长度),变为这样的式子: \[ 1+\frac{1}{2}+\frac{1}{4}+\frac{1}{8}+\cdots+\frac{1}{2^n}+\frac{1}{2^n}+\frac{1}{2^n}+\cdots \] 后来,有人提出拉普拉斯妖处理的最大信息量为 \(10^{120}\) bit,这终结了这位伟大数学家的妄想。

计算能力

人类的大脑拥有约 \(8.6\times10^{10}\) 个神经细胞,假设存在一种方式,拥有关于计算单元指数级的计算能力,那这个方式搭配上对应的计算单元,很有可能超越拉普拉斯妖,能够模拟一个逻辑自洽的完整世界。

对这个世界自身的模拟也许不太现实,上面的复杂度函数是否收敛还是一个待解决的问题,但一个独立于这个世界的虚拟世界,显然是可以做到的。

某些时候人脑可能以某种形式满足了上面的一切条件,构建出了一个这样的虚拟世界。

我将这个由人脑构建的世界,称为心灵现实。

天目路

我拉上绿色冲锋衣校服的拉链,提了提羽绒服的领口,11 月,天气已经开始转凉。背着双肩包,这是我最最标准的出行装备,包内是一台笔记本电脑加上一个充电宝,以及一些其余的数据线,这套装备可以连接几乎所有能够连接的电子设备,充电宝加电脑的续航总时间为 4.5h,足以应对大部分情况。

我低头看了下时间,20:00,突然感觉有什么不对,街道冷寂的有些可怕,我重新抬头,城市应有的嘈杂重新冲入双耳,车流继续冲过不太对称的十字路口,一位大叔忽视了红绿灯,灵活的在车流中穿梭,一边接着电话,很快没入马路的另一头。

我始终有一种不真实感,似乎我是独立于这个世界之外的存在,但来回的行人依然会避让站在盲道上的我。

我去一旁的民乐超市买了一瓶农夫山泉维他命水,结账的还是那个小伙,他一边看着视频,一边熟练的输入数字,我扫码付款。也许是看我背着背包,他并没有问我需不需要塑料袋。

我靠在地铁 A 口,不知道该干什么,只能看着影子,区分影子的不同部分,估测着它们的长度,再认真观察了一下路灯的结构和位置,根据瓷砖计算出我和路灯的距离,并依此尝试推算路灯的高度。

小迈

我想的很认真,将书包取下,去拿第二层的草稿纸和电脑时,熟悉的声音叫住了我。

“幻影彭?”

我抬头,是小迈。

“真巧。” 我漫不经心的回应他,没有停下手中的动作。

“你干啥?在这里做题?”

我如实告诉他我的目的,他也蹲下来,我看他并没有带书包,就把草稿纸和笔递给了他,我开始用 MsPaint 画草图,他看着电脑屏幕在纸上标数据,我的身高是 1.75m,通过估测不同影子部分的投影方向和长度,可以在平面上算出以我为顶点的三角形的顶角弧度。

手动算三角函数是不太可能的,至少我和小迈都不想爆算泰勒展开,不过我有 Python。

1
2
3
4
from math import *
a = pi / 180 * 74
sin_a=sin(a)
cos_a=cos(a)

反正挺方便的,根据瓷砖估测的距离成功计算出三边长,然后再目测检验了一下,没什么问题,换下坐标平面,很轻松的解出了路灯的高度——11.8m,比考试时计算都轻松很多,毕竟标准答案是我俩说了算。

我上网查了下,高度是 12.5m,误差不是很大,毕竟目测的距离和影子长度还是差距(事实上测影子长度是小迈用手大拇指和食指张开的距离测的,虽然我们俩都会背自己身体部分的一些数据,例如我臂展是 1.71m,手一乍的长度是 18cm,以及我的常用笔是 12cm,但是还是不太准,直尺并不是我的标准出行装备之一)。

观察与细节

收好电脑和草稿,我把笔别入衣袖下方,这样的话往往可以很方便的取出笔然后用笔去做一些手够不到的事,而且笔不会掉。但由于小迈比我高 15cm,所以这个时候其实只需要让他来就好,除非是捡落在某个狭小缝隙里的小物件,这个时候我相对修长的手指配上一支顺手的签字笔就很实用。

突然发现居然没有人围上来看我俩算,我想在街上拿出草稿纸和电脑算东西并不是什么太正常的表现,之前在奶茶店楼上用相对平凡的 Dev-C++ 写竞赛题目的代码都有人好奇的围上来。

抬头还是人来人往,旁边的核酸检测点排起了长队。

我尝试观察行人,捕捉着一些细节,发现一件很有趣的事实,随着我观察的时间变长,一个人的细节也越来越丰富,粗略扫过去,只能分辨出一个人的大致特征,随着视线聚集时间变长,我可以逐渐观察并区分出外貌细节,“细节”这个词很抽象,但确实就这样。在聚焦某个人时,其它信息会被弱化,大概就是 “旁边有其他人和车路过” 这样的弱化信息。

目光从一个人移开,被弱化的信息复原,变为了有多少个人经过,男女占比多少,年龄大概是多少等等...

掉下床的老鼠

逐渐强化的信息让我想起以前在寝室和同学玩的一个思维游戏。

假定你是一只老鼠,你从睡觉的床上爬了下去,你需要以一个老鼠的视角去行动,你需要想象你的视觉听觉触觉

我能以老鼠的视角,相对合理的行动约 2min,这 2min 内,我能够想象出我以一个 2cm 的视觉高度在宿舍楼活动,最远的一次我成功下了楼,从铁门之间的缝隙穿了出去,跑到了食堂的后门,然后失败了。

这个游戏对人的记忆力和想象能力乃至意志力都是一个极大的考验,初次尝试很难连续的过上15s,当出现位置瞬间改变,视角恢复,画面不稳定,变成第三人称,甚至消失等现象时,就说明你失败了。

有一次我在想象中没有站稳,从 1.8m 高的床的缝隙中掉了出去,体验了 3s 的自由落体运动,经历了那样的失重感,但我落地后还能正常行动,视角这些也正常,不过我知道自己失败了,因为即使考虑空气阻力,一只老鼠掉下去也最多经历 0.8S 左右,但是我经历的时间甚至长度上可感。

每天晚上能这样玩个差不多 3min,再来就真的不行了,太累了,那一种来自神经深处的疲惫感,比做数学一试题还累(因为我做不动二试的题),助眠效果应该不错,每次玩完后很快就能睡着,但全力动脑是很累的,很容易没到疲惫的极限就“断线了”,全力思考 5S 带来的疲倦感,对我来说和全力冲刺 100M (约14S完成)类似。

同一个人

靠着护栏,我开始了这个一般在睡前玩的游戏,闭上眼防止真正的视觉信息干扰,先是第三人称视角,我看见想象中的灵魂离开我的身体,形成了一只虚构的老鼠,落在地上,四肢传来粗糙的触感,我的视角变为 2CM 高度。

小迈是知道这个思维游戏的,他没有打断我。

我尝试移动,却发现动作很呆滞,用抽象一点的词汇来说,就是时间的粘度变高了,我小心的穿过人流,皮鞋,运动鞋,放下,抬起,速度很慢,我避开了这些足有 4M 高的庞然大物(记住,此时我的视觉高度是 2CM,身长 10CM),靠着残疾人通道的边缘走下斜坡,跳到花台,脚下变成了黑色纹理的大理石,我飞速跑过(这样可以减少思维量,让大脑放松一下)。在花台边缘我停下了,开始观察一个路人,他穿着蓝色卫衣,兜帽的吊带垂在两侧,平头短发....

视线出现抖动,然后变成第三人称,我知道我失败了,我睁开眼,画面很是模糊,控制着睫状肌散焦再聚焦,向地铁口望去,那边的有一条小路,联通了花台所在的广场。

我看到一个穿着蓝色带兜帽卫衣的小伙子走过来,外貌细节和思维游戏中的一模一样——他们是同一个人。

重新回想一下游戏里那个人的外貌特征,再比对,直到他消失在地铁站的楼梯口,我深吸一口气。

移动扑克牌

“怎么了?” 熟悉的声音把我从想象中拉回来。

“假设你有一叠扑克牌,一共 54 张,按照大小为第一关键字,花色为第二关键字排序”,我想到一个问题,它出自《天书》。“那么,如果你一次操作可以选定其中的一些牌,将它们按照原顺序放到最开头,那么将这副扑克牌顺序翻转的最小操作次数是多少?”

“举个例子,假设原来是 1,2,3,4,你可以先选 2,4 变为 2,4,1,3,然后再选 4,3,变为 4,3,2,1。“ 我补充解释道。

“答案是 \(\lceil\log_2{54}\rceil=7\),考虑构造序列的母矩阵...”,他没怎么思考,就给出了一种解法,但不是天书中的解法。这个方法,是我在一篇题解中看到过的方法......

完美算法

”不对吗?“

”证明没有问题,所以你怎么想到这个方式的?“

”观察。“ 小迈给了一个非常模糊的回答,”我还有事,先走了。“

”等一下。“ 我的声音有点发颤。

小迈回头,“怎么?”

“你有什么事?” 我有点不礼貌的追问,进入思维游戏,我全力排除真实视听的干扰,老鼠向地铁口跑去,抬起 2CM 的视线看地铁口的广告,这次只坚持了不到半分钟,视线就开始抖动,我睁开眼。

“去买零食。” 小迈回答,延迟有 30S,甚至大于我的对话机器人 鹿灵AI。

构建细节

答案明晰了。

我回想起 L4D2 的建模,如果不考虑空气墙,那么看起来主角确实在一个城市,但如果开启作弊模式,很容易发现并没有构建一个完整的城市,而只是一些关键部分。欺骗玩家,只需要构建关键部分的城市。

同样,要欺骗人的大脑,也不需要构建一个完整的世界,只需要实时构建一些细节,如果计算资源被用于构建大量需要。

消耗计算资源最有效的方式,是构建虚拟机,在刚刚尝试思维游戏的时候,这里已经出现了破绽...

我将猜测告诉了“小迈”。

是否真实

Hack The World

考试

T1

简单题写蠢做法。

我用了 \(set\) 来维护同一行同一列的信息然后还要查询什么的,实际上 vector 就可以了,记录一下该点的行下标和列下标。

T2

简单题写挂。

首先转对照局面。

想到可以先二分个左时间出来,然后仿超级钢琴。

实际上可以二分个左时间和右时间暴力排序,码量更小了。

写挂是排序的各种问题。

排序,尤其是对编号排序,一定要搞清楚排的到底是什么的序。

T3

做不来的趣味题。

考场上想到可以 \(O(n^3)\) 的动态规划,方法是设 \(dp[i][j][k]\) 表示考虑到 \(i\),漏了 \(j\)\(B\),当前有 \(k\)\(A\),转移可以做到 \(O(1)\)

左看右看都觉得有一维是多余的,但是就是去不掉。

考虑最终答案的分界线,然后动态规划,就可以去掉一维,但是动态规划变成反向了。

容易发现转移的重复性很高,相当于是一个行向量乘上若干矩阵再乘一个列向量,可以反过来写。

考场上没想到反过来写,是因为反过来之后动态规划就没有明晰的组合意义了,所以陷入了正向的窠臼,不容易思考。

参考某道题(T2)

T4

考试

周末做题脑袋一团浆糊

T1

参考 11.10 T4 的思路,按照 height 从小到大考虑,这样同时也方便了安排 \(a_i\),然后发现当前叶子只能有被占用或者继续拓展,如果当前的 height 为 \(i\),那么拓展到 \(i+1\) 还需要考虑右儿子,所以只记一维是不行的。

于是记 \(dp[x][y]\) 表示当前 height 有 \(x\) 个,height-1 有 \(y\) 个,其实可以不用记高度,因为只需要算答案, \(height\) 增加的时候答案整体增加就可以了。

转移的话还需要套上一层已经安排到的位置,设 \(dp[i][x][y]\) 表示前 \(i\) 个已经被安排,当前 height 有 \(x\) 个,height-1 有 \(y\) 个,由于 height-1 已经被强制选过了,延申过左儿子了,所以不能作为叶子,作为叶子转移的只有 height,这样的话阶段是 \(i\),然后再是 \(x\),最后是 \(y\)。保证了无环性。

同阶段转移,顺序先枚举 \(x\),再枚举 \(y\),转移到 \(dp[i][x+y][x]\),容易发现除了 \(0\ 0\) 都是无环的且符合拓扑序的。

不同阶段转移很简单。

小猪猪经常把 height 写成 heigh,我不说是谁。

T2

非常非常妙的一道题。

暴力无非就是并查集,但是如果加边比较多,暴力并查集就寄了。

并查集有交换律,考虑改变并查集运算的顺序,达到加速的目的。

可以用倍增的思路设计一种广义并查集,然后操作就被暂时拆了,\(fa[x][i]\) 表示 \(x\) 为起点的 \(2^i\) 个数的并查集父亲,意义是 \(x,x+1,x+2\cdots\) 的并查集父亲分别为 \(fa[x][i],fa[x][i]+1,fa[x][i]+2\cdots\)

注意这里的操作是具有整体性的,必须对于 \(2^i\) 个点都满足,才能改广义并查集的父亲。

考虑下放操作,这是简单的,只需要将 \((fa[x][i],i-1)\)\((x,i-1)\)\((fa[x][i]+(1<<i-1),i-1)\)\((x+(1<<i-1),i-1)\) 连边就行。

很难从一道题中总结出有用的东西,但是不妨作为一个启发性的思路。

这个思路也可以被认为是 lazy_tag,具体怎么思考会得到不同的启发。

T3

感觉每次考贪心都不会。

考虑先排除掉包含其它线段的线段,变成左右双单调。

然后容易发现选的线段是一段区间,一旦选线段变成选区间,就好做了,朴素的方式是动态规划,可以做到 \(O(n^2)\),看上去已经不容易优化了。

发现答案的计算方式是比较简单的,考虑最终情况,假设选了 \(i\) 作为终点,那么实际上每个 \(i\) 的贡献是独立的,为 \(-L_i+R_{i+1}\)(注意这里忽略了无交的情况,无交的情况下面再讨论),这里的 \(i\) 不能为 \(n\),因为 \(n\) 本来就是终点,排序取前 \(k-1\) 大即可。

加上那些被排除的线段,被排除的线段,要么原封不动放回去,不对答案贡献,要么就自成一段,枚举前面选了几个区间就行,取最大值。

注意到,我们对无交的情况,答案计算方式是有问题的,需要和无交情况的最大值再比较一下,无交情况的最大值就是选最长的 \(k-1\) 个。

总的来说,这是一道分类讨论题,先讨论包含的情况变成双单调,再排除无交的情况变为排序贪心。

T4

Boruvka 题。

Boruvka 本质上是把 Prim 和 Kruscal 结合了起来,然后需要求一个 \(mn[i]\) 表示连通块 \(i\) 连出去的所有边的最小值,然后尝试连边。

Boruvka 的过程会进行 \(\log n\) 次,可以这么说,Boruvka 以一个 log 的代价,换来了通过预处理同一连通块求 多个 Prim 中的最小值的机会。

Boruvka 是来自异世界的神秘算法,请和我念:“\(\text{B--oru--vka}\)

Boruvka 的核心是要求 \(mn[i]\),但是一般来说也可以用分析连边性质(一般是三元环或者四元环)来减小边数,比如边权为异或的题目,分析 \(Kruscal\) 的过程可以做到 \(n\log^2n\),而不必拘泥于 Boruvka。

Boruvka

考虑对于连通块怎么求 \(mn[i]\),一件非常阴间的事情是需要排除掉同一联通块的元素。

如果看成染色,那么就是元素有颜色,就是求全局不同于某个颜色的最小值,区间修改。

还是可以线段树,维护一个最小值和颜色,不同于最小值颜色的次小值,然后就可以做了。

一个矩阵加需要映射成两个。

仿 Kruscal

好困难,不会。

用主席树维护求出整个邻接矩阵,考虑哪些边是有用的。

1110总结

考试

T1

莫名奇妙写挂的题。

题本身意义不大,但是我写了很蠢的做法。

分析问题本质上是需要动态查 \(i\ge l,a_i\in x_i\)\(a_i\) 不是很大,可以直接预处理每一个元素的 \(next\),就很方便了,但是考场上写了扫描做法,还写挂了,非常蠢。

拿到题不要直接开冲,可以多想一下有没有更好写的做法/更方便,前面的题没那么难。

T2

观察发现答案不超过 \(1\) 的充要条件是存在一条长度为奇数的路径,答案不超过 \(2\) 的充要条件是存在一条路径。

先假定图联通,所以问题变成了计算无向图 \(s,t\) 之间是否存在长度为奇数的路径,有以下三种方式

直接最短路

思想是分层图跑最短路,但实现上没那么麻烦,考场写的这个做法。

DFS

如果有奇环,那在奇环上绕一圈任意可达了,所以考虑先 DFS 求个深度,如果有奇环答案全部为 \(1\),否则路径唯一求出来就行

二分图

还是奇环的思想,实现上使用黑白染色。

并查集

这是常数最小的写法,还是考虑分层图,有一条边则合并不同层的两个点,查奇数路径就是不同层是否联通,偶数路径就是相同层是否联通。

T3

不算太难的题,但是确实没有想出来。

首先有个经典结论,先手必败的充要条件为所有可选元素为偶数,证明归纳,显然。

算先手必败显然比先手必胜好算,所以算必败。

先把元素做前缀和,再对 \(2\) 取模。问题就是需要选一个子矩阵,满足首尾两列元素值相同。

考场上想到了可以哈希,由于常数,虽然是 \(n^2m\) 的,但只有 \(52pts\)

非哈希做法

考虑固定下边界,移动上边界的过程,发现相同元素的集合在不断变小,而有了这个集合就可以算答案,这个东西是可以每次 \(O(m)\) 计算的,这样的常数较小,可以得到 \(76pts\)

正解1

先得想到它已经是个字符串题了,考虑上边界不断变化的过程,发现不合法的矩阵个数等于当前 \(m\) 个字符串两两之间 \(LCP\) 的和,然后考虑字符串排序的方式求 LCP,类似后缀排序的 \(height\) 数组,发现后缀排序是很好做的,因为每次上移一行,就是归并排序的过程,\(height\)\(rk\) 都可以线性维护,得到了 \(height\) 之后就单调栈搞定。

Another Approach

考虑非哈希做法的等价类思想,发现虽然维护过程是 \(O(nm)\) 的,但实际上等价类的个数是 \(O(m)\) 的,考虑以移动下边界的方式考察当前下边界所有上边界的等价类,自顶向下的更新等价类,该拆分的拆分,实际上和正解1本质相同。

T4

条件比较特殊,需要先观察。

\(T'\)\(T\) 的修剪。

\(T\) 的修剪和 \(T\) 的右子树相同,那么考虑 \(T\) 的右子树 \(R(T)\),那么 \(L(R(T))=L(T')\),递归的,\(R(R(T))\)\(R(T)\) 的修剪相同。

归纳边界是 \(L(T)=\emptyset\),此时右子树可以任意延申右儿子而不受限制,先假设当左儿子为空时右儿子也必须为空,这样就有了一个边界。

因此,如果 \(L(T)\) 确定了,就可以确定出有边界的树的唯一形态。

考察 \(L(T)\) 的各项数据对应到的 \(T\) 的数据。

容易发现: \[ leaf_T=size_{L(T)} + 1\\ height_T=height_{L(T)}+1\\ size_T=height_T+\sum\limits_{u\in L(T)} height_u \] 接下来的事情变成了设计一种合理的方式去枚举合法的 \(L(T)\),并能够计算这些数据。

子树合并枚举二叉树

枚举二叉树,比较合理的一种方式是以子树大小为阶段来合并,需要记录的信息是 \(dp[i][j][k]\) 表示子树大小为 \(i\),高度为 \(j\)\(\sum height_u\)\(k\) 的总方案数,合并的时候需要枚举三维做卷积,复杂度为 \(n^2k^2m^2\),难以通过本题。

不难发现 \(j\) 可以用前缀和优化,但是其它两维是卷积,动不了的,复杂度 \(O(n^2km^2)\),实际上常数比较小,可以过掉。

深度顺序枚举二叉树

刚刚的方式是子树合并的方式构造二叉树,现在考虑用深度顺序构造,设 \(dp[i][j][k][s]\) 为构造深度为 \(i\),树大小为 \(j\)\(\sum height\)\(k\),可用点数为 \(s\) 的方案数,转移需要枚举向下构造的点数 \(t\),得到 \(t\) 后可以预处理转移系数,顺便计算出新的 \(j,k,s\),复杂度为 \(O(kmn^3)\),更加优秀,事实上 \(j,s,t\) 远远取不到 \(n\),是非常优秀的复杂度。

但是这个方法是假的,因为深度和 \(\sum height\) 没有必然联系,所以无法计算 \(k\)

高度顺序枚举二叉树

考虑以子树高度的顺序,降序构造二叉树,这和深度顺序又不一样。

考虑设 \(dp[i][j][k][s]\) 表示子树高度为 \(i\),大小为 \(j\)\(\sum height\)\(k\) ,叶子个数为 \(s\) 时的方案数,注意这里是按照高度顺序构造,即强制要求先选的部分的高度大于后选的。所以又额外的要求是枚举接下来的增量时需要将所有叶子至少叠加一层,枚举增量 \(t\) 时预处理系数即可,复杂度和深度顺序类似。

0%