2023NOIP 前总结

10.23 模拟赛

首先将题目都看了一遍,T12 看起来都还需要一点分析,给 T3 秒了,并且发现 T4 是原。

感觉身体有点不舒服,脑袋有点痛,觉得这把优势很大,趴着睡了一会儿。

起来分析 T1,但是半天画不对样例,一直没有搞明白他的二叉搜索树是咋插入的,有点没辙。

用力观察样例解释,大胆猜测了一个做法,感觉很符合这道题的性质,发现居然能过大样例,哈哈,那不管了。

然后被 T2 卡死了。


一直没有想到一个很好的计数的方法,感觉这个过程非常复杂,难以划分出一些过程/阶段,难以计数。

思考暴力怎么做,即是否能够抽象出一个判定条件。

try1: 考虑按照位置匹配,现在需要判定的是一个区间是否可以变成 \(a/b\) 之类,这个感觉还是比较可做,于是我们高兴地得到了一个 \(O(n^3)\) 的判定方法,即设 \(f[i][j]\) 表示是否可以用前 \(i\) 个原串字符得到前 \(j\) 个需求串之类,可能可以优化到 \(O(n^3/w)\),但是复杂度瓶颈显然在于枚举 需求串。

看到这个复杂度,有了一点联想。发现非常难啊!题目的本质是一个 DAG 计数可达点,听起来就很恐怖,因为标准做法是 \(O(n^3/w)\) 的,何况这道题 \(n\) 是不知道啥量级。

try2: 想起此类题目一个套路就是把这个操作改一下,本来是 00->1, 11->0,然后通过 在奇位置 \(\oplus 1\) 之类的手段改变操作,使得构成一个双射并让题目更加清新。

很可惜,脑洞不够,没能找到一个清明简洁的转化。

try3: 再次尝试抽象整个过程,尝试得到 操作序列 和最后的字符串的关系,md,还是很难!

try4:用力手模了一些串,并着重手模了 a,aa,aaa,aaaa,发现了一个没有用的递推式。

try5:继续尝试抽象整个过程,发现可以将操作视作每次将一个位置标记为空,但并不删去这个位置,那么实际上,最后保留下来的位置一定是原序列的一个子序列。

那么这个实际上是一个子序列计数的问题,只不过加了一点奇怪的操作,但是想来应该也是可以做的!

(实际上这个就是对 idea1 中的 “枚举需求串” 的优化,只是当时并没有意识到)

于是,套用子序列计数的方法,只需要处理出 \(nex[i][0/1]\) 表示最小的 \(j\) 使得区间 \([i, j]\) 可以被消成 \(a/b\),那么 \(f_i = f_{nex[i][0]} + f_{nex[i][1]} + 1\)

思考一下这个玩意的正确性,因为这个 nex 实在奇怪,选择相信子序列计数的这个套路的可推广性。

写出来发现算多了!坏!

小力模拟,发现问题出在 \(+1\)\(+1\) 本来的意义是认为这个点就是子序列的末尾了,但是放在这里,其实是认为后面的位置都被删掉,但是可能后面的位置并不一定可以删掉,所以这里还需要判定一个后缀是否可以删空。

遗憾地,犯饼了,受 try1 影响,认为可以贪心地能删则删,那么只需要简单地维护一个栈就可以。

(一个反例:abbb,从后往前加数,会搞成 aba,但是可以先弄成 aab

改完发现可以过小样例,但是大样例被打爆了。

有点茫然。

时间还有,心情还是比较放松,发了一会儿呆。

实在没有办法了,开始对着大样例准备大力模拟,发现很好啊,一来就遭遇了困难:

对于一个形如 aabababa 的末尾,第一个 \(a\) 的方案数应该是 \(n - i + 1\),但是按照我的算法会计算成 \(3\),这是因为没有将连续操作的情况纳入考量。

坏了!感觉很 G,难道子序列计数的套路错了?

心乱了,尝试性的乱打了一些补丁,但是越弄越不对。

迎来了 GG 的结局。


中间抽时间给 T34 写了,都写得很顺利,大概这就是献祭 T2 所得。

T2,距离正解有两个问题没有解决:

  • 判定一个后缀是否可消的方法错误,这个也就是 try2 没有做到的结果,即没有找到一个正确合适简明清晰的判据。实际上,应该是将 A 视作 1, B 视作 2,那么区间可以清空的条件是 sum % 3 == 0 且存在相邻相同数字(可以启动)
  • aababa 的末尾如何处理?如果冷静分析,那么其实可以发现这样的问题仅仅会出现在末尾这一次,之后的情况,即使出现 ababa 形状,也不会产生贡献的问题。那么只需要特判一下就好。

有点可惜。


下午继续口胡昨天晚上的 CF,看了一些题解,发现了自己口胡的一些错误(

晚上又来 4 道题,但是感觉晚上状态不是特别好。

T1 是简单的,T3 分析了一下得到了简明的条件;

T2 最开始脑抽想错了一个显而易见的事实导致一直做不出暴力,后面也只会 \(O(n^2)\) 的暴力。

T4 想了一段时间,但是只会简单的可能 50pts 的性质分(居然有 50pts 这么多/jk/jy)

那么,这场期望最高分 100+70+100+50。

但是 T3 是否真的可以写出来是存疑的,目前只有 170。

10.24

难度排序:\(T4<T2<T1<T3\)

开场看题:

看到 T1 第一时间感觉有点难的样子,首先注意到了每次都是对 \(\bmod k = 0\dots k-1\) 的位置操作,虽然说这个看起来并没有啥用

T2 看起来是不太难的计数题,T3 看起来是贪心题(yr 应该很会)

T4 给了我莫大的信心,因为这种往 T4 放无聊且傻波的树剖+线段树的题目,前面的题大概不会难。

然后开始仔细思考 T1,对于这种博弈题,没有办法了那么只能先思考简单情况。发现当 n=k+1 的时候只有头尾可能成为答案,但是 n=2k+1 的时候答案的式子 min/max 交错并不好看。

阿巴,思考了一下二分答案,但是并不是很会判定。

一个神秘的契机,我知道答案最后必然是某一个序列中的数字,进一步的,随着 n=k+1 的情况划过我的脑海,我很快意识到答案只可能在 \(i\bmod k\equiv 1\) 的位置取到。

高兴地,发现自己虽然还没有做法,但是已经给未来的复杂度除了 \(k\) 了,思考是否存在和 \(k\) 有关的做法。

分析操作,回想起“每次都是对 \(\bmod k = 0\dots k-1\) 的位置操作”,那么每次必定会删掉某一个 \(i\bmod k\equiv 1\),那么可以视作是对于这些位置做 \(k=1\)

\(k=1\) 的时候,答案就是中位数。

题外话:这道题是 UNR#7D1T1 改编,是 7月份 做过的题,但是当时场上大概是对着发了 2h+ 的呆,甚至经过了一点旁边 GF 老哥的提示才做出来。而今天,做这道题加强版的时候却格外顺利,这其中,也许一部分隐隐约约有做过原题的功劳。

T2 感觉挺自然的容斥。最开始对着无标号分析,以为只需要在无标号的情况下乘上一个 \(n!\) 就好,后面发现不是这样的,修了修给无标号的情况做的 DP 发现不可以,又花时间分析了一下这个方案数到底咋算。但是大体思路都是一样的,把第二层子树大小的限制容斥一下就好,感觉这个 \(\frac n4,\frac n2\) 加上重心,已经提示得非常明显了。特别注意需要保证点定的点是重心。

T3 分析了一个贪心,但是没注意到一个细节,G 了... 发现如果 \(b_i+a_j>b_j+a_i\),那么在使用 \(3\) 代价的情况下,会选用 \(b-a\) 更大的,然后错误地得出结论:如果要选择代价 \(2\) 的操作,那么一定是选择一个 \(b-a\) 从大到小的一个前缀。

当时隐隐约约觉得这个贪心有点奇怪,但是分析了一下发现对于 a=0/b=0 的性质分都挺对,想着打一个出来反正有性质分垫着,然后惊讶地发现居然可以过大样例,感觉大样例很可爱,又被要过题的希望冲昏了头脑,高高兴兴地走了。

这个贪心的问题在于,他只能在 \(a_j\) 被选的情况下生效,如果 \(a_j\) 没有被选,即可能当前只余下 \(2\) 块钱,那么我显然会选择 \(b\) 更大的,而不是 \(b-a\) 更大的。

T4 意料之中的好做,最开始想要偷懒不维护反着合并的情况,后面又发现确实得维护一个...还是写得挺快。

10:30 解决了所有战斗,志得意满。

简单做了一点检查,发现没啥可拍的,T1/2 除了正解也写不了很大的暴力;T3 也差不多,似乎没有给暴力的分,怪!;T4 大样例都过了肯定没有问题。

然后没啥事儿干,看了一会儿别人上体育课,然后回来多想了一想昨天晚上的 T4,然后给昨天晚上的 T2/4 都写了一个自认为的订正。

有点担心自己会不会消愁了,但是大概多少还是有点被冲昏了,很自信。

然后在 surf 世界中所向披靡


T1 没注意到 k=1 的时候不能写 i%k==1,良心出题人绑 subtask,全卡完了。

T2 虽然看到了模数可能不是质数,意识到了不能求逆元了,但是在打 \(O(n)\) 处理阶乘逆元的时候没有带脑子,因为是板子;于是全部求大了。

T3 写的是假做法,活该被卡,还好数据不是非常强劲,在数据比较小的时候没有卡掉我,骗了一点性质分以外的分。

感觉是一次挺珍贵的模拟赛,在正赛之前爆出了问题,经历了算是新类型的心态问题,并对我最近的状态提出一个警告。

自从 CSP 前 2 天左右跟 pyber 谈了谈,便有意放松,自己也知道这不过是借口,但是看起来并没有真的知道。

感觉这个其中收驰度量是非常重要的。


心情很放松,下午有条不紊地打摆(

心情很放松,晚上有条不紊地打摆(

10.25 构造

被今天的题目完全打爆了,啥都想不出来

感觉上午最开始的时候还有点困,今天思考的时候都不是很集中

看似今天做题进度不错,但是是因为代码好写的原因,实际上感觉思考的过程并不充实。

别混啊哥,感觉时间混得太快了。

[CF1364E]X-OR

使用了交互题的常见思路,即倒推题目,即假装我知道了 xxx,那么这道题就可以做了。为了知道 xxx,我需要 \(\dots\)

本题中,可以发现如果我知道 \(0\) 是谁,那么我 win 麻了。

啥时候一个数字是 \(0\) 呢?发现一种充要条件是和其他所有数字的 按位或 不会得到相同的数字。

但是这个判据太弱了,需要的复杂度太高了。

注意到排列是可以打乱的,但是显然没啥用。

solution:

考虑这样一个求 0 的方法:首先随便点一个数为 \(cur\),然后和其他的没有检查过的数字进行检查,如果发现 ask(cur,x)=cur,那么令 cur=x。检查 \(n\) 次,那么最后 \(cur\) 一定 \(=0\)

那么现在的问题是为了判定 =cur 成立,需要知道 cur 的具体的值。

好消息是 cur 的具体值不需要求很多次,最多求 \(\log n\) 次就可以了,这是因为 \(cur\) 最多替换这么多次。

除掉 log,当前剩下每次的可操作次数是 \(15\) 次左右,自然的思考,随机找 15 个数 \(v_1,v_2,\dots v_15\) 出来,直接认为 \(x\) 就是 \(\cap_i (x\cup v_i)\)。可以知道,这样出错的情况是存在某一个 \(x\) 没有的二进制位使得这 15 个数字都有,这样发生的概率是 \(\frac{1}{2^15}\) 量级,没啥问题。

而且,如果把上述的判据改成 ask(cur,x)|cur,那么将不会有任何的问题,即使计算出错,那么 cur 值二进制位数只会变多,只会给这个过程增加一点复杂度。(当然,如果当前 cur 实际上已经是 0 但是算错了,那么只能说太背了)

[CF1365G]Secure Password

很厉害的技巧。

首先有一个 sb 做法,发现和 \(\cup_i a_i\) 不同的 \(p\) 最多有 \(64\) 个,考虑如何快速得找出来。一个自然的想法是分治,但是无论啥想法都做不到 \(13\) 次把这些位置找出来,因为即使是找出来了,也要花 \(64\) 次询问。

那么这时一个没有前途的思路,似乎应当放弃这个性质。

经由上面分治做法的启发,发现这个 \(p_i\) 是所有不是 \(a_i\) 的或 听起来很眼熟,感觉是一类整体二分问题。

但是直接套用这样的分治也是不可以的,这里的复杂度是整体二分所承受不了的。

solution:

那么,更为具体明白的阐明这个整体二分所做的事情,实际上是 尝试分出 13 个位置集合,使得这 13 个位置集合的并集可以凑出所有的 \(p_i\)

(这个其实感觉很像某随机化技巧,即考虑用若干次随机分组,使得答案一定在某次分组中 [THUSCH2017] 巧克力)

非常厉害的,考虑给每一个位置重编号。

注意到 \(\binom {13}{6} > n\),脑洞大开地,将 \(1\to n\) 映射到某些二进制位不超过 13,且刚好有 6 个 \(1\) 的数。

然后问 13 个集合,分别是在新编号上有 \(1\) 的位置集合。

计算一个 \(p_i\) 的时候,答案就是所有 \(i\) 的新编号 没有 的二进制位对应组的答案的或!

这样的方式能够保证 \(p_i\) 可以算到所有 \(\neq i\) 的位置,因为所有新编号都刚好有 \(6\) 位且互不相同,所以一个和 \(i\) 的新编号不同的 \(j\),一定存在某一个 \(i\) 没有的二进制位使得 \(j\) 有这个二进制位。

只能说是非常巧妙,不知道怎么想到的。

[CF1290D]Coffee Varieties (hard version)

阿巴阿巴可以从 \(k=1/n\) 入手,然后看到这个 \(n^2/k\) 自然想到让 \(\frac k2\) 个数字分成一组。

问题是如果暴力枚举两组并进行询问的话,那么复杂度是 \(2n^2/k\),超了一些。

solution:

发现复杂度瓶颈在于每次都要暴力枚举两组并花时间把第一组的数字加入,这实际上,对于那第一组而言,反复加入又清空了很多次,这样是非常亏的。

形式化一下问题,现在需要做的事情是有一个 \(n/k\) 个个点的完全图,需要把所有边都遍历一遍。

自然的,我们可以把这个完全图拆分成若干条链。

类比地,类似一个远古的 trick,出现在另一道某关于二分图的构造题,草了,找不到是啥题了。

分组并连边:(\(n\) 是奇数)\(i (i+1,i-1) (i+2,i-2)\dots\)。那么,对于任意组 \(i,i+1\),这两组的边拼起来就是啥啥啥之类,草了,全忘记了。

此处,考虑这样一条链:\(s,s+1,s-1,s+2,s-2,\dots\),可以发现,对于一条边 \((i,j)\) 而言,必然出现在某两条链 \(s_1,s_2\) 中,且 \(|s_1-s_2|=\frac n2\),所以,只需要枚举 \(s\in[1,n/2]\),即可以覆盖完全图所有的边。

经过计算,这样的操作数可以符合要求。

[CF1292E]Rin and The Unknown Flower

分类讨论题。

问一遍 CC,CH,CO,HO,OO 就可以确定 \(1∼n−1\) 中的 C 和 \(2∼n\) 中的 O,自然可以得知 \(2∼n−1\) 中剩下的位置为 H。

可以暴力确定 \(1,n\) 是啥。

经过计算,上述算法的问题仅仅出在 \(n=4\) 的时候。

此时显然可以打表打出一种合适的决策树,或者如同 duyi 一样,大力分析得到一种决策。

[CF1288F]Red-Blue Graph

简单上下界费用流可行流,简单分析如何才能使得满足某一个点的条件,容易发现走的是形如 \(R-B-R-B-R-B-R-U\) 这样的路径之类,结合二分图的背景,很容易往流方面思考。

进一步的,可以想到令一条边如果从左往右流那么表示颜色是 \(R\),反之是 \(B\),否则是 \(U\)

事实上,可以给每一条边染色分别定代价的,当时还思考了一下为什么题目给的是固定的代价而不是每一条边一种代价,是否会出现某些性质之类....

[CF1097E]Egor and an RPG game

神仙题。

solution:

感性一下 LIS 和 LDS 肯定是互相制衡的。

考虑一种 \(f\) 很大的序列:\(1,3,2,6,5,4,10,9,8,7\dots\),记这个的 \(f\) 叫做 \(c(n)\),知道 \(c(n)=\min\{k|\frac{(k+1)(k+2)}2>n\}-1\)

这个 \(f\) 很大是因为对于当前局面,LIS=LDS 且后继局面也满足这样的条件。

通过感性理解其实已经可以认为 \(f(n)=c(n)\) 了,不管怎么说,至少 \(f(n)\ge c(n)\)

考虑构造一个划分数量 \(\le c(n)\) 的方案。

受这个 f 很大的序列的启发,即后继局面一直满足某一个条件,考虑归纳构造。

设当 \(m<n\) 的时候都可以构造出 \(\le c(n)\) 的划分。

设当前 LIS 的长度为 \(k\)

  • \(k\le c(n)\),由 Diworth 定理,肯定存在大小为 \(k\) 的划分。
  • \(k>c(n)\),那么直接将这个 LIS 分为一组。

可以计算证明,case 2 符合归纳。

[CF1227G]Not Same

难得的一道简单构造。

题目可以转化为构造 \(n+1\)\(n\) 列的 01 矩阵使得每一行都不相同,且每一列的 \(1\) 的和为给定值。

那么,首先将所有给定值从小到大排序,先无脑地填出一个阶梯状物。

可以发现,目前已经分成了若干个等价块,每一个等价块是行的 \(1\) 和相同的部分。

可以得到一个 sb 的构造:为了使得第一行和其他行不等价,考虑将 \((1,n)\) 位置的 \(1\) 放到某一个 \((x,n)\)\(x\) 满足 \(x\) 所在等价类有多余两行/除非没有这样的 \(x\),那么 \(x\) 可以是随便一个。

为了使得 \((2,n)\) 和其他不一样,假定 \((3\dots n+1,n-1)=0\),类似 \((1,n)\),考虑将 \((2,n-1)\) 往下放。

可以发现这样的操作一定可以将所有的等价类都拆开,证明?证明就是感性。

荔枝一点,初始答案矩阵为空,所有 \(n+1\) 行都在同一个等价类。

考虑第一列的填写方法,可以发现第一列至少有一个 0,至少有一个 1,因为 \(a_i\le[1,n]\),那么必定可以找到一种方法拆开某一个大小 \(>=2\) 的等价类。

可以拆分 \(n\) 次,于是可以拆出 \(n+1\) 个等价类。

所以实际上不需要排序。

[AGC004F] Namori

厉害题

solution:

先考虑树的情况。

考虑给每一个点黑白染色,题面操作转化为每次交换相邻两个不同颜色,目标是使得所有位置反色。

或者可以这样理解,初始在偶层的位置都放置了一个黑色棋子,每次可以把棋子往相邻位置移动一步,如果被挡住就不能动了,目标是使得所有棋子都到奇层。

那么,假装忽略掉棋子被挡住的情况,是经典的 独木桥 ,视作是在操作另外一个棋子。

那么,令 \(w_u=\sum_{subtree}col_v\),黑权值 \(-1\),白权值 \(1\),答案就是 \(\sum|w|\),这个原理和 每次只能移动某张牌到相邻牌堆 那玩意差不多

合法条件是 \(w_1=0\)

考虑偶环的情况。随便拆掉一条环边,先按照树的方式处理。枚举环边 \(\dlt=x\),发现对于 \(\sum |w|\) 的影响量类似于很多个点到 \(x\) 的距离,那么处理一下 x 取中位数时候最优。

考虑奇环的情况,可以发现这个时候拥有了一个喷油泵,只要 \(w_1\) 是偶数就可以给他喷成 \(0\)

有一点细节。

10.26 模拟赛

时间分配:1h+看题+5minT1+2hT2+40minT3+20min打暴力并摆烂

今天写 T2 很顺利啊,一遍写对,啥都没改就过了。之所以还是用了 2h,是因为写了一点发现最开始想错了一些东西,然后重新分析了一遍并重打了一部分代码。大概 10:50 的时候过了大样例,心里面不太放心,写了一坨暴力 assert 检查所计算出来的东西,发现居然没啥问题!全都写对了!

非常高兴,这份代码里面有诸多细节。

本来说给 T3 秒了,结果发现始终会算重,不得已抛了。

时间已经所剩无几,记得 T4 也是比较简单的,赶紧冲过去打了一个 \(O(n^2)\),知道后续大概就是分讨分讨啥的,但是已经没有时间给我分讨了。

T3 不会,很不甘心,觉得这个必是傻波题。


T3 果真是傻波题,搞复杂了反而算不对了,发!反映出在时间不太够的情况下不够冷静。

T4 果真是分讨,但是非常麻烦,考场上应该需要更多时间。

没有注意到 T4 还有 40pts 性质分,把我的 O(n^2) 的改一改就能写,比较可惜。

了解到了随机排列,前缀最小值期望个数是 \(O(log)\),这时因为每一个 \(i\) 成为前缀最大值的概率是 \(\frac 1i\)


晚上虽然开了一套题,但是主观上并不是很想做模拟赛,所以在乱做,打得很放松。

最开始看题,感觉 T1 好像挺难的;T2 肯定是 DP,猜测重点在于点定贡献的时刻;T3 傻波计数,看起来就是纯恶心人的玩意;T4 首先思考线段树,发现不太行那么 4s 就分块,感觉分块完就容易做了。

思考 T1,感觉操作空间挺大的,那么果断猜了一个结论,算了算大样例发现结论是对的。

T2 被卡了很久,一直不太会。感觉一下,大概是一个 \(f[i][j][0/1/2]\) 的格式,但是转移一直没咋写出来。

T3 意料之中地难算,非常多情况,使我头昏脑胀,爱来自计数

算了 1h+ 算不对,摆了!

T4 没有时间了。

只能说没有摆,但是当然算不上尽力,就当是做题了(有点浪费套题了/cy)

10.27

机房里面没有草稿纸可以嫖了/oh/oh/oh

上午是玛丽赛,开场把所有题目都看了一下,发现 T12 看起来还是比较可爱,T3 儒略日纯 cs。T4 非常过分,居然发了 solution,我觉得这个太嚣张了,是对我的挑衅,必须要狠狠地惩罚一下这个 T4。

看完题解,想了一点代码细节,8 点左右启动了。

写到大概可能 10:20?(草了,这把没计时)把第一版写出来了,一看 9.4kb /cy。其实也还好,主要是为了保险,变量名写得很长。

果不其然,无法通过样例。通过大力输出,写错了如下两个问题:

  • 为了去重方便,采纳了题解的建议,先将所有 lv 都搞成不一样的。但是这样的问题是查询的时候,可能查询不到本来 lv 相同的部分,这个可能要处理一下 mx 表示离散化后对应的最大标号之类。
  • 并查集。两个联通块被 边 \((u,v)\) 合并的时候,应当是先让 \(u,v\) 跳到各自联通块的“根”,即并查集的根,然后在执行线段树的合并。否则,线段树合并的信息肯定是没有上传完整之类的。

小插曲:忘记下大样例了,临时找何老师拷了一份...

高兴的,在 10:50, 通过了 sample123。但是 sample4,极限数据,跑不出来。

认为是爆栈了之类的,没管,但是这个其实显然是 T 飞了,只是当时太过自信了,认为只要答案能够算对,那么复杂度肯定是有保证的。

赶紧 rush T12,T1 小 rua 了一会儿,出来了,时间大概 11:10 不到。

然后写 T2,被卡死了,dfs 出现了数组中的数莫名其妙被修改的事情,导致操作一直进行不正确。

经过巨佬的提醒,将二维数组的传参改为了传一个结构体,赛后 2min 发现直接过了!

草了,感觉这个问题起码浪费我 30min+(说不定可以....),二维数组传参的时候居然传的是指针,居然不会新赋值一个出来,我觉得这个很愚蠢,以后都传 struct 了。

赛后发现 T4 只有 44pts,后面 2e5 的数据全 T 飞了。

吃饭的路上想不通为什么会 T,吃完饭,感觉唯一的 T 的可能性在于线段树合并反复合并自身。

回去一看,果然,又是你,并查集。

  • 写并查集的时候,没有判定两个 \(u,v\) 本来就在同一个联通块的情况,这种情况下,如果做线段树合并,那么会将自己和自己合并,那么复杂度会被卡成 \(O(n^2)\)

太愚蠢了,价值 55pts 的 if(u==v)return ;


下午帮 czl 和 zqm 调了调 T2,然后想了想晚上 pb 的题,做了道构造。

感觉时间混得挺快的(

晚上听 pb,感觉有些答辩题,但是也有几道题着实给我惊艳到了。

发现自己还是不会昨天晚上套题的 T2,md,跟他磕上了。

[AGC006E] Rotate 3x3

通过手玩,发现题目可以转化为,给定一个 \(a_i\) 使得 \(|a_i|\) 构成排列,每次操作会交换 \(a_i,a_{i+2}\) 并将 \(a_i,a_{i+1},a_{i+2}\) 都变成其相反数,判定是否可以把 \(a_i\) 变成 \(1\dots n\)

solution:

发现还存在一种操作,使得 \(a_i,a_{i+2}\) 变成其相反数。

自然地,考虑将原序列按照奇偶位置拆成两个部分考虑。

由于存在上述操作,发现仅仅关注 奇/偶 序列中为负数的位置的奇偶性。如果序列的绝对值已经有序,那么合法当且仅当 奇/偶序列 为负数的位置的个数都是偶数。

考虑在使得序列有序的过程中对于负数个数的影响。

发现如果想要使得奇序列有序,那么至少需要逆序对次交换,且每次交换都会恰好使得 偶序列的负数个数改变1。

又注意到,任意一种使得序列有序的交换方式的交换次数奇偶性都和逆序对的数量一致,所以只需要分别求出两个序列的逆序对数奇偶性就可以了!

这首先有 \(O(n\log n)\) 的做法,但是只求奇偶性的情况下还可以做到更好。

具体的,有这样一个结论:

通过邻项交换实现的任意两项交换用的交换次数均为奇数。

证明:考虑我们交换位置在 \(x<y\) 的两个值,我们先将 \(x\) 移到 \(y\) 紧邻左侧,用 \(y−x−1\) 步,然后交换 \(x,y\),用 \(1\) 步,再把 \(x\) 换回去,用 \(y−x+1\) 步。共用奇数步。

又知道任意一种交换序列的奇偶性和逆序对一致。

所以,只需要找到序列的置换环集合,对于长度为 \(l\) 的置换环,对于答案的贡献是 \((l-1) \bmod 2\)

10.28

早上过来给昨天晚上没写的 Rotate33 写了,然后计划继续补前天晚上的套题。

给套题的 T1 写了,并调出了当时写了一部分的 T3,然后继续死磕 T2。

pyb 分配了 pbT5 的任务,本来以为不算难,但是被创飞了。

通过学习他人的代码,总算是学会了,下午写半天写不对(

感觉这种树形 DP 比啥 DS 难写多了,如果昨天的玛丽赛是 4 道树形 DP,我觉得可以把我创飞。

10.29

今天早上起来就有点头痛,没有重视。下午睡了一觉,从一侧头痛变成两侧头痛(

晚上过来,状态并不好,中间睡了一段,然后摆摆摆!

晚上走的时候,感觉问题不大。

10.30

早上过来,没啥问题,虽然这边已经堆了一坨杂题没写,但是不管,得先把一直没解决干净的套题订正了。

于是看了套题 T2 的题解,发现 DP 状态确实设计得比较巧妙,学到了。

给 T4 分块干了,调了很长的时间,发现是每次重构块的时候忘记清空了...

下午晚上做了点题,最后时间在看 bxy 讲的我挺感兴趣的 pb 杂题 T7。

今天状态应该还行?

[AGC036D] Negative Cycle

学习

solution:

没有负环=可以跑 Johnson

考虑给每一个点赋一个势能 \(h_i\)

首先 \(h_i\) 单调,且对于 \(h_i\) 相同的段代价是删去里面所有 \(-1\) 的边,对于两块 \(h\)\(\ge 2\) 的要删掉 \(1\) 边啥的。

搞一个 DP 即可。

[CF1246F] Cursor Distance

solution:

key observation: \(k\) 步可以跳到点 \(i\) 的是一个区间 \([L_{i,k},R_{i,k}]\)

那么现在的问题是 \(\sum_i\sum_k (n-1-R_{i,k}+L_{i,k})\)

考虑如何倍增快速跳

发现 \(L_{i,k}\) 的转移只和 \([L_{i,k-1},R_{i,k-1}]\) 的字符集有关,如果字符集没有变化,那么是可以使用倍增的。

于是,一直跳直到字符集变化,容易在跳的过程中维护贡献。

复杂度 \(O(|\sum|n\log n)\)

需要真正理解才可以写出代码。

AT_wtf19_d Distinct Boxes

使用了类似 [ABC257Ex] Dice Sum 2 的技巧,挺厉害的题目。

首先二分答案 K。

考虑所有选择 \(K\)\(x_i,y_i\) 的方案 \((X,Y)\),将这些点排布在坐标轴上。

取出 \((X_j,Y_j)\) 构成的下凸包,K 合法当且仅当 \((R,B)\) 在这个下凸包的右上方

使用 Trick,对于任意一个 \((X_j,Y_j)\) 必然存在某一组 \((p,q)\) 使得取 \(px_i+qy_i\) 的前 \(K\) 大的 \(\sum x=X_j,\sum y=Y_j\)

考虑二分 \(p/q\),以找出 \(X\le R\) 的点中 \(Y\) 最小的一个点 和 \(Y\le B\)\(X\) 最小的一个点

\((R,B)\) 在凸包上最近的两个点)

剩下的问题是对于二分出的一组 \(p,q\),如何计算对应的 \((X,Y)\)

暴力的方法是,从 \((0,0)\) 开始执行一个类似 bfs 的过程,每次从队列中取出 \(px+qy\) 最小的点,直到取出 \(K\) 个。

但是 \(K\) 可能很大。考虑计算 \(K\) 的上界,即答案的上界。假设 \(R=B\),那么可以得到这样的最优构造:

\((0,0),(1,0),(0,1),(2,0),(2,1),(2,2),(1,2),(0,2)\dots\)

通过计算,可以知道这样的对数是 \(R^{\frac 23}\),所以不可以 bfs。

对于这种求解前 \(K\) 大之和的问题,考虑二分第 \(K\) 大是多少,设为 \(z\)

(当然之后的问题还可以使用类欧解决,但是我不会/ll)

考虑如果当前从队列中取出了 \((x,y)\),那么一定已经取出了 \((0\dots x,0\dots y)\) 一共大概 \(xy\le R^{\frac 23}\) 个点。

那么,可以知道 \(\min\{x,y\} \le R^{\frac 13}=2000\)

所以,只需要枚举 \(1\dots 2000\)\(x\),知道一个 \(x\) 可以贡献 \((z-px)/q+1\)\(y\)

复杂度 \(O(V^{\frac 13}\log^3)\)

序列 sequence

经由以往的做题经验,第一时间可以意识到这道题的关键可能在于计算贡献的时刻放在哪里。

例如 2023国庆FZCSP模拟赛三场联考 中的某一道题(懒得找了),在滑动窗口的时候,在某一个数字刚刚进入/刚刚离开窗口的时候计算贡献。

经过思考,可以设出一个 sb DP,\(f_{x,i,j,k}\) 表示 \(x-2,x-1,x\) 的值是啥。

然后难以寸进,知道我只关心最大值在哪里。

一个思考是考虑计算 \(f_{i,j,0/1/2}\) 表示 \(a_i=j\) 作为最大值被计算 \(0,1,2\) 次的答案之类,但是发现很难。

solution:

只关心最大值,考虑设出最大值的位置。

\(f_{i,j,0/1/2}\) 表示最大值在 \(i-0/1/2\),值为 \(j\)最大值位置+1 到 \(i\) 还没有填的答案。

这样的好处是,知道 最大值位置+1 到 \(i\) 这一部分的值的填写方案其实和两头的最大值填写啥同时有关,所以放在填写下一个最大值的时候再决策。

转移使用前缀和优化。

10.31

看题发现 T1/4 挺可做的,T23 都还需要分析一下。

40min 给 T12 秒了,然后剩下 3h50min 拿 0pts,好策略。

大部分时间投给了 T3。

老实说,T34 暴力分只有 16pts,按理说也应该打,但是着实有点懒。

感觉后面心态开始出问题了,最后可能对着电脑发呆了 30min。

也有点意外,整体的思考体验还是挺充实的,感觉还算集中, 虽然最开始切完 T12 有点开香槟就是(

T34,题目其实也没啥水平,但是为啥不会做呢?


T3 最开始分析太糙了,对着给定的 \(a_i\) 思考对于其他位置的限制。搞出来一个非常简单的条件,写了一发发现只能过第一个样例(

又用力分析了一下,感觉到这样子分析没有啥前途,顺利地转化了一下思考角度,考虑每一个不在序列中的数字,有多少个位置可以插入。

然后顺利的分析出来了。

其实,按理说,到这个位置,后面的事情是普及的内容,但是就是没想到,可能总归是差点脑子。

剩下最后一步计算贡献。知道每一个数字可以插入 \(x_i\) 个位置,且知道随着数字的增大,可以插入的集合是不断变大的。

但是注意到一个致命的问题,在于,如果往一个空隙里面插入了 \(y\) 个数字,那么方案数还需要乘上 \(y!\)

然后非常憨憨地开始 DP,设分了多少组啥的,然后一通爆推,得到一个 \(O(n^2)\) 的算法,然后当然知道是路径计数模型,但是这个贡献似乎有点过于奇怪的,所以计数不了一点。


T4,忽略了一个细节问题导致全盘皆输。

没有注意到建立出 Kruskal 重构树之后,由于多了 n-1 个假的点,所以可能会选出一些包含假点的集合,但是这些集合可能去掉这些假点之后和其他的某一个方案本质相同,那么就算重了。

同时更新了一个认知:背包容量为 \(k\) 的树形背包暴力合并的复杂度是 \(O(nk)\) 的。

Game

神仙题

首先考虑搞一个反演,如果知道 \(f_k\) 表示选择 \(k\) 个合法的方案总数,然后咋咋计算出答案之类。

考虑计算 \(f_k\),假如字符串长度实际上是 \(1\) 而不是 \(5\),那么实际上是求选择 k 个区间使得有交的方案数。

由于值域很小,当然如果暴力记录当前的交集是啥是没有扩展性的,考虑枚举最后形成的交区间

将其视作是链(树),使用 点边容斥 的技巧,枚举 \(i\) 或边 \((i,i+1)\),计算覆盖其的区间个数 \(x\),贡献到 \(f_{1\dots x}\)

这个贡献肯定不能枚举 \(i=1\to x\),考虑先暂且以系数 \(1\) 贡献给 \(f_x\),把所有的贡献做完之后,再直接在 \(f\) 之间做转移。例如,f[k-1]+=f[k]*k 之类啥啥的。可以发现这里这个转移可以写成卷积的形式,但是由于这道题时间很宽松,暴力写一个 \(O(n^2)\) 也不干事

将这个做法扩展到 \(|s|=5\) 的情况,考虑当前有 \(5^{26}\) 个点和 \(5^{25}\) 条边,依旧执行点边容斥,\(2^5\) 枚举每一维度是点还是边,现在需要做的是计算 \(5^{26}\) 个点被覆盖的次数。

那么这个是超立方体加,单点查询;暴力 \(2^5\) 差分一下,变成若干个单点修,然后求高位前缀和。

阿巴阿巴都暴力做。然后一样的乘好点边容斥的系数贡献给 \(f\)

11.1

打模拟赛,发现 T1 是傻波题,T2 题目很奇怪,T3 可能比较好做,T4 感觉非常可做

然后推了一会儿 T4,发现了一些关键性质,知道应该使用多项式进行思考,但是推出来的形式就是不可做。

有点烦,按理说感觉该用的性质都用了,而且,从感觉而言,这道题目应该是手到擒来的套路题。

思考 T2,由于对于重心的理解太薄弱了,只了解重心在三角形内的一些性质,而不太清楚重心在多边形的应用,挺 G 的,现场探究出了一些重心的性质,例如两个合并的时候,可以视作质点然后权值平均啥的;还想起了小学的经典的求不规则物体重心的悬线法。

猜测了一下是否其实只使用 ()/(())/((())) 这种简单的括号序列就可以穷尽所有解的空间,试了试样例 3 发现并不是这样。

过程中被巨佬持续 fake 加焦虑输出了一顿,内心中的焦虑也被激发了出来,然后开始急,思考不集中

本来以为 T3 是会的,然后发现最开始 naive 了,顿时雪上加霜

去 6 楼尽头窗台冷静了一下,思考了一下人生,感觉这种焦虑的产生证明着心态的失败,思想的失败。

思来想去,总结为懦弱,喜欢退,惧怕困难,怀疑自己

应该更加自信一点

下午比较悠闲,慢慢地想,慢慢地做,比较舒适。

看并学习了一下看题赛的题目,但是没有时间写了,觉得里面几道题还多有意思

T2 Equilibrium Point

给定坐标 \((x,y)\) 表示点定它为重心,构造一个长度为 \(n\) 的合法括号序列使得重心真的是这个。具体的,将左括号是做 \((1,1)\),右括号看作 \((1,-1)\)

阿巴题。

探究一下样例,发现其实这个图形性质挺好的,拐弯都是直角。

由于只了解三角形的重心,猜测是否只用三角形就可以求出一个解,试了试样例 3 发现并不是这样。

过程中,涉及到两个图形重心的合并,发现合并操作是(新重心必定在原重心的连线上) \((x_1,y_1,m_1),(x_2,y_2,m_2) \to (\frac{x_1m_1+x_2m_2}{m_1+m_2},\frac{y_1m_1+y_2m_2}{m_1+m_2},m_1+m_2)\),进一步,还可以推广,\((x_i,y_i,m_i)\to (\frac{\sum x_im_i}{\sum m_i},\frac{\sum y_im_i}{\sum m_i},\sum m_i)\)

一个特别好的事情就是发现 \(x,y\) 其实暗含某种独立性。

然而并没有什么用,因为发现如果爆搜,状态数实在是太多了。

自然地,考虑 meet in the middle,爆搜出前半段,多了 \(x\) 个左括号的图形的 \((x,y,m)\) 三元组;对右边同理。时间复杂度应该挺对。

但是这个做法有两个问题。第一个是说,必须要写一个分数类啥的,这个说不定要爆 int,而且挺麻烦;第二个,输入的时候,需要把 \((x,y)\) 翻译成 \(p/q\) 的形式,虽然说 \(x,y\) 的确都是有理的,但是太麻烦了,否则如果不转,那么 mtim 完之后可能不好计算需要的 \((rx,ry,rm)\)

solution:

首先,通过一番鼓捣,可以发现对于 \((x,y,m)\)\((xm,3ym,m)\) 必然都是整数,那么不妨考虑在整数域上做题

一个结论,一个合法括号序列 \(S\),必然可以被拆分成 \((A)B\) 的形式,其中 \(A,B\) 也是合法括号序列。

那么,所有长度为 \(2i\) 的括号序列 \(S\),都可以通过枚举长度为 \(2j\le 2i\) 的括号序列 \(A\) 和长度为 \(2i-2j-2\)\(B\) 得到。

仍然考虑之前的爆搜的算法,发现其实只需要保留下所有是合法括号括号序列的 \((x,y,m)\) 即可,同时,对于长度相同的合法括号序列,如果对应的三元组相同,那么肯定没有必要保留多个,其实也就是说,只关心三元组有哪些。

通过打表,发现 \(\sum_i\) 长度为 \(i\) 的合法括号序列对应的本质不同三元组个数 是很少的。(之前的爆搜不能做的原因是即使括号序列不合法,也需要保留)

而经由上述的结论,我们可以使得在搜索过程中不涉及到任何不合法括号序列对应的状态。

做完了。

T4 庫的F序计数

没做出来,挺可惜的

题目要求树的拓扑序,众所周知,这个概率是 \(\dfrac{1}{\prod siz}\),那么本题所求就是 \(\prod siz\)

发现有 \(nk\) 个点,有点不妙,但是发现 \(siz\neq 1\) 的只有 \(n\) 个点

那么现在的问题是每次树上链 \(siz+k\),求 \(\prod siz\)

观察题目性质,发现模数刚好是 \(2^{16}\),且保证 \(k\) 是偶数,那么自然思考多项式方向。

由于我是 sb,且题目没有说的很清楚,且样例刚好,我以为每次的 \(k\) 都是相同的。

那么式子可以表示成 \(\prod (c_ik+1)\),拆开就是 \(\sum_{i=0}^{15} k^i f_i\),其中 \(f_i\) 表示选出 \(i\)\(c\)\(\sum\prod\)

每次的操作是对于链 \(c\)\(+1\),看起来似乎可做了一点。

思考了很久,发现做不了一点,唯一的慰藉是在链上的情况,\(c\) 都加一有抵消的情况,比较好处理。但是这个无法推广到树上

solution:

首先,每次的 \(k\) 是不同的。(这大概有助于我不要拆成 \(c\) 的形式然后误入歧途失去机会)

类似 [2018 集训队互测 Day 1]完美的集合 ,考虑转化成 \([x^0]\prod (x+siz)\)

\(f(x)=\prod (x+siz)\),当然只用保留 \(f\) 的前 \(16\) 项,发现我很会 \(f(x)\to f(x+k)\)

那么,树剖线段树维护一下就好,或者使用全局平衡二叉树(?已经忘了)

复杂度 \(O(n\log^2 v\log^2 n)\),但是常数不大

11.2

8:30 给 T1 秒了,然后发现今天是原题大赛。

给 T4 简单思考了一点性质,上了个厕所回来开写

9:50 写 T2 写晕了,感觉这个起床时间带来了一些困扰

10:20 总算是 T2 拍过了

11:20 T3 暴力打完。

12:00 T3 过拍

12:10 T4 bf

虽然说 T2 是原题,但是不巧,当时就写了一会儿没写出来然后基本照着 std 写的,代码印象不太深刻,但是思路还是挺深刻的。

虽然说 T3 是原题,但是不巧,前几天讲题的时候有点低烧,讲这道题的时候正好在睡觉,所以只听了前半截。

觉得 T2 提前见过,不太公平,给 T2 注释了一行代码控控分(

感觉这把比较可惜的地方在于:

  1. T4 打完暴力之后,感觉可能是 12:00 生物钟到了,同时可能起床生物钟导致的问题爆发,整个人进入了一种比较松懈、懒惰的状态,虽然知道部分分写满有 60pts,但是就是不想动。
  2. T3 在 行中有障碍 的简单情况反而写错了一个小细节,题目关键的行没有障碍的部分反而写对了。然后样例太少了,导致以为给 T3 打的那个暴力是正确的,后面使用这个错误的暴力对拍当然是无用的

下午提前放 30min,打球打爽了/cy

晚上订正了一下然后开摸/cy/cy/cy

希望自己的心态可以进一步提高,不仅是场上,而且是平时

P8476 「GLR-R3」惊蛰

T4 对应的原题。

有点失败,场上没有想到正解

我是 DP 状态优化大师,我一步到位设计了一个只有一维的 DP 状态,非常好状态设计,使我优化困难,爱来自 T4

大概是发现 \(b_i\) 肯定是某一个 \(a_j\),那么直接设 \(f_i\) 表示 \(b=a_i\) 的最优代价,然后贪心从后往前 DP 啥啥的。

这样搞可以得到一个 \(O(n^2)\) 的做法,DP 柿子:

\[f_i=\max_{i<j,a_i>a_j} \{f_j+\sum_{k=i+1}^{j-1}([a_j\ge a_k](a_j-a_k)+[a_j<a_k]C)\} \]

由于这个柿子过于复杂,思考了诸如 决策单调性/CDQ分治 等常见手法发现都不可以。

solution:

暴力地,设 \(f_{i,j}\) 表示 \(b_i\)\(a\) 中排名 \(j\) 的答案。

发现转移是每次先做一个后缀 min 得到 \(g\) 数组,然后:

  • \(j<rk_{a[i]}, f_{i,j}=g_{i-1,j}+C\)
  • \(j\ge rk_{a[i]}, f_{i,j}=g_{i-1,j}+val[j]-a[i]\)

考虑类似 JOISC 2019 day2 两道料理,考虑线段树维护 DP 值。

第一个是区间加。

第二个是先做一个区间减,问题是需要区间加一个序列

注意到在线段树上,我只需要能够做到当把一个修改拆到某一个节点的时候,可以快速地维护出他的新的 mn 值就可以了

注意到这里是两个单调不降序列的加法,所以原最小值一定在区间左端点,且新最小值也一定是区间左端点的值。

那么这样就可以维护操作了。

现在线段树里面可能是两个割裂的单调不增的序列,需要对这个序列做一个后缀min

在左边线段树上二分,然后打区间推平标记即可。

实现看起来很复杂,其实不难。


犯了一个巨消愁的错误,浪费了 40min 左右的时间,这是线段树区间修改:

void add(int rt,int L,int R,int v){
    if(t[rt].l==t[rt].r)return upd(rt,v),void(); 
    pushdown(rt);
    if(L<=mid)add(ls,L,R,v);
    if(mid<R)add(rs,L,R,v);
    pushup(rt);
}

亮点在于 t[rt].l==t[rt].r,实际上做成了高贵的单点修改,不好评价。

可能是因为打球把脑子打没了,同时这个在线段树节点中记录 \(l,r\) 的写法平时没咋写过不太熟悉。

11.3

上午听得还算尽力,下午钻研了一下上午的题目,然后补了一点总结之类

感觉上午讲题的 T2 绝对是原题,但是死活就是找不到,怀疑就是今年 7 月份的时候没有写总结,然后后面也没有时间补,然后直接漏了。

然后开摸!感觉对比高一,已经有点惭愧了

有一些题没有完全搞懂,挺可惜的。

Florida

(感觉 mj 讲得好意识流啊。。。)

复习了一下啥叫做对偶。

那么,对偶后为一个费用流模型。首先对于原图的边,依然连一条流量无限,费用为 1 的边。其次,对于原图每一个点,若入度小于出度,则从 \(s\) 连一条流量为出度减入度,费用为 \(0\) 的边;若出度小于入度,则向 t 连一条流量为入度减出度,费用为 \(0\) 的边。

因为这张图,\(\sum flow(S,u)=\sum flow(u,T)\),其中 \(flow\) 表示边的容量,而要求是 S 这边至少跑满(才能满足 \(\sum f_{v,u}-\sum f_{u,v} \le d_{in}-d_{out}\)),\(T\) 这边最多跑慢,所以流量跑满时对偶问题满足。跑一个最大费用最大流即可。

考虑如何输出方案(线性规划求出对偶问题解之后反推是没有通解的),有这样一个深刻的方法:强点有流量的边的权值差为 \(1\),然后跑差分约束。这样为什么正确呢?

  1. 此时,原问题答案肯定最小(差 1)
  2. 我可以构造出一组对偶问题的解(为什么?不知道)

也就是说,认为一条边有流量等价于二者权值差 1,没有流量认为差 \(\ge 1\)。为什么?不知道,fk。

这种题我感觉做起来就很凭感觉啊,我当时和 xxx 一起做这个题,就觉得有流量的边两边差是 1 就就很对。——mj

不好评价了/ll

Evaluation

给一个长度为 15000 且由 {1, 2, . . . , 8, 9, x } 构成的序列,你需要在元素之间加入 {+, −, ×, √} 四种运算和左右括号(其中 √x 为先将 x 的绝对值开根号在向下取整)。设添加完毕后的函数为 f (x ),你需要该函数在 [1, 9] 的整点取值满足f (xi ) = yi , xi ∈ {1, 2, . . . , 9},其中 yi 均为自然数且小于等于1e9。

挺有意思的,考虑类似拉格朗日反演的思路,构造 \(f(x)=\sum y_i g_i(x)\),其中 \(g_i(x)=[x=i]\)

考虑 根号 操作的特殊性,发现 \(g_i(x) = 1- \sqrt{\sqrt{\sqrt{x-i}}}\)\(y_i\) 可以二进制凑。

Box Selection

百囚犯问题的 OI 延伸

最优的解法是每一个人沿着开出的纸条的标号走,这样走的步数是所在的置换环长度。

可以感性理解这样走的最优性:由于这些人同生共死,所以每一个人对于最终结果的影响系数都是一样的;假如乱玩,那么概率是 \((\frac 12)^n\),非常小。假如钦定前 \(50\) 个人尝试前 \(50\) 个,后 \(50\) 个人尝试后 \(50\) 个,那么概率是 \(\frac{50!50!}{100!}\),这实际上是将多个人绑在一起,从而获得了更大的赢面(更充分地利用排列的这个性质)。而置换环,看起来已经将排列的性质利用到极致了。

理性的证明非常有意思,其意旨于证明这个策略是答案的上界:

考虑游戏规则变成:让 \(1\) 去找自己的牌,且过程中如果找到了其他人的牌,那么那个人就不用找牌了;然后让下一个编号最小的牌还没有被找到的人来找牌。要求每次找牌的人使用的步数不超过 \(50\)

可以发现,\(1\) 找牌的期望步数不会因为 \(1\) 采用的策略而有任何的改变,那么实际上这个游戏的获胜概率是固定的,且和原问题一致。

显然,这个游戏获胜概率 \(\le\) 原问题。

所以原问题的最优解就是走置换环。

回到本题,答案为所有环长小于等于 k 的全排列个数。

Forged in the Barrens

一个由 n 个数构成的序列,你需要将序列切成 k 段,使得每段的最大值与最小值之差的总和最大。输出 k = 1, 2, . . . , n 的答案。

首先可以有一个费用流建模,说明答案对 \(k\) 有凸性。

应用错解不优。

\(f_{l,r,0/1/2,0/1/2,k}\) 表示 \([l,r]\) 已经选择了 \(k\) 对最大值-最小值,且区间左/右侧,啥都没有点定/点定了某一个最小值/点定了某一个最大值 的答案。

转移,考虑分治,设 \(mid=(l+r)/2\),那么:

\[f_{l,r,x,y,k}=\max_{i+j=k} f_{l,mid,x,0,i}+f_{mid+1,r,0,y,j} ,\max_{i+j+1=k} f_{l,mid,x,1/0,i}+f_{mid+1,r,0/1,y,j} , \max f_{l,mid,x,y,k}, \max f_{mid+1,r,x,y,k} \]

阿巴阿巴调整一下,把难看的 \(i+j+1=k\) 也搞成 \(i+j=k\) 这种,由于有凸性,那么转移就是闵可夫斯基和,听起来很高级,其实排排序。

P-P-Palindrome

有 n 个字符串 si ,你需要求有多少对回文字符串 (P, Q),P, Q ∈ S,S 为所有 si 的字串构成的字符串集合,且 P + Q 回文。

显然 P, Q, P + Q 拥有共同的周期 t,其中 t 为回文串。

建立回文自动机,通过 fail 指针寻找整周期即可

11.4

模拟赛,感觉挺难。

昨天晚上回家已经很困了,但是开摆之后发现又不困了,然后持续摸鱼(

早上起来,非常困,坐在考场,感觉状态着实不行,脑子被卡住了。

感觉 T1 挺典的,但是结论忘记了,随便猜了一个不想管了。

T2 涉及到树计数,首先考虑了一下 prufer,但是抱歉给记错了,以为 prufer 计算的是无标号的情况,但是实际上计算的是有标号的情况。

那么没有办法咯,首先贡献计算显然是可以枚举链长的,然后缩一缩啥的。

额,感觉后续还是有点难,先考虑一个基础的,如何计算大小为 \(n\) 的有标号无根树的数量。

经过一番鼓捣,可以推得这样一个玩意:\(G^{\prime}=exp(G)\),但是显然毫无作用。

答案是什么呢?设 \(H=exp(G)\),答案是 \(\sum_l \binom{n}{l}l! [x^{n-l}]H^{l} (n-l)! 2^{n-l}\),毫无作用,毫无作用!

发现 T3 有点牛马,脑子有点想不清楚,不管了!

发现 T4 似乎是 sb 题,不确定,再看看,发现好像真的是傻波。磨磨蹭蹭开始写,但是由于没有注意到一个重要的事实,就是即使是新“解法”的一群点,以错误的顺序遍历子树,也会是正确的欧拉序的一个子序列,于是代码写得异常繁杂,写不对了!

不管,摆烂,下次一定。

11.6

感觉早上风吹着有点冷,脑子晕晕的。

看到 T1 是构造,心里面没啥感受,想着做就对了。稍微想了一会儿,搞了一个构造,结果发现把题目看反了,G

看了一眼 T2,很快地把状态设出来了,鼓捣了一个 \(O(n^4)\) 的转移觉得常数很小感觉一下觉得这道题就是卡常题

看了一眼 T3,很快秒了,最开始给他不管不顾套了一个线段树分治上去,然后套路 Hall 定理,分析可以发现是最大子段和问题,只不过最后一段需要特殊处理一下。

T4 令人回想起来了 Iron man,这个是转化成若干条线段求交的问题,放到本题显然是不适用的。

简单思考了一下,发现有一个树上链求交,说这个不久刚好撞我枪口上了,前段时间模拟赛的时候才自己暴力分讨了一遍,但是真的好麻烦啊。感觉会有点同余相关知识,自己把 exgcd 重新感觉了一遍。

回到 T1,还是不会做。

不知道为什么,就很有摆烂的心思了。

好说歹说把 T2 给写了,然后发现自己推的式子假了,缝缝补补搞了一个 \(O(n^5)\) 的转移,知道坏了。

摆烂之心愈盛,感觉似乎对自己太放纵了点。最后可以说是啥都没写,啥都没交。


下午听讲评的时候虽然都已经提前会了,但是就是不想打代码,可能是差点动力,差点自信。

搬完草稿纸回来一鼓作气开敲,愉快的下午

晚上有点困,勉强订正完就开摆了,然后玩飞盘。

11.7

忽然惊觉摆得太久了,每天都给自己松和松和一点,日积月累下来,不知道又是多大一笔帐

感觉最近在上课时间摆的时长大幅度增加。细细比较却有点惶惶,过去的自己似乎几乎不上课摸鱼,仅仅是这一点就已经秒杀了太多。

浑浑噩噩就是一生。

阿巴阿巴,虽然是摸鱼,但也还算是学了点东西。

11.8

状态不好,玩原神!

11.9

体会到了啥叫做力不从心,只能说天凉好个秋

发现这几天状态都很不正确,感觉脑子没有兴奋起来,没有热起来,思考了一会儿,就想要趴下,仿佛认为枕着手闭着眼睛想题很厉害。

很明白这个样子是做不了题的,洗了两次冷水脸,还是晕乎乎

不好评价了,啥都不想干,知道应该打打暴力之类,打毛线

心态有问题吗,有问题,没有打暴力就是证明;但是又着实出在一个奇怪的状态,说急似乎也不急,仔细不放弃地思考。

阿巴,那么,就当是生理原因吧。感觉状态着实太差了,仿佛慢性死亡,无言的悲伤涌上心头


这几天不太想写总结,毕竟最大的问题不在于考试策略。

化疗结束了,什么年代了,还在看爽文,pyb 太脱节了。但是谁又能否认,如果不是爽,人类不会阅读;所以似乎全都算爽文!

阿巴,下午晚上都小睡了一会儿

11.10

感觉状态还是不行,到了后面 10 点中左右想题就不太行了,11 点差不多就开始摆烂了。

今天 T4 还挺有意思,决策单调性优化矩阵乘法,同时也提示了这种段DP其实可以上矩阵快速幂,感觉这个角度还挺神的

晚上在颁奖典礼上罚坐,突然意识到距离 NOIP 不到 7 天了,希望 11.18 不会是我退役的日子,且行且珍惜吧

回来思考 排列 这道题,想了比较久,题解还有点迷糊没看懂

——和以前一模一样。

——嗯。

——发生了好多事。

——真的发生了好多事。

——这一次,我们也要在这里分开。

——不,这一次,我们一起等到最后。

11.11

今天状态还可以,中间写代码的时候脑子小晕了一下,但是除了最后 30min 基本上都头脑清醒,11:30 开始就摆了。

大概 7:50 才落座,总用时 3h50min 左右。

最开始 1h+ 给题目都分析了一边,着重探究了一下 T4 的性质,探究发现没啥性质。

阿巴开始写代码,T1 被一个小细节卡了一会儿,线段树优化建图线段树上的虚点应当比正常的点更小,这样小根堆的时候才正确。

T2 不会添加环境变量/cy,把 gender 贺进来魔改,没写啥 bug(除了消愁了写了个 for(int i=x;i>=0;++i) ),最主要的时间花在卡常。

T3 写得梆梆快,但是想错了修改的时候一个细节。

T4 推了一下,根据以前的经验,这种看起来有性质的题目一般最终都会通过某种暴力的方法获得正解,但是确实没有注意到一些关键性质,打了一些暴力走了

11.12

周末暴力摆烂了一天,晚自习感觉状态又有点不太对,对于一些套路不太敏感,脑子空空的

希望状态可以尽快地调整到最好来迎接下周六

做看题赛 T2,已经把正解写出来了,但是没有意识到自己写的是正解。。。(没有注意到 \(\sum \frac ni=n\log n\)

11.13

模拟赛,感觉心态不太正确,T123 搞完之后可能剩下 90min,并没有很用心地思考 T4,并没有把 T4 做出来的决心。

T2 题目描述不清楚,按照描述一个圈可以包含重边,那么这样的话,1 2 3 2 就也会是一个圈,那么最小圈要么是三元,要么是四元,这个是容易的。样例毫无强度,交上去居然有 55pts,数据好水,这些全都是三元环。

T3 做到最后一步建边的时候感觉有点印象,之前好像做过类似的,但是没有意识到直接就是原题,略微惭愧

订正得比较快,去学习了一下 Charlie,也就是最近几场模拟赛出题人/组题人(代码和 std 头部完全一样)的博客,学习了一下他所收集一些 trick,然后重点做了几道 贪心

主要是学习了一下思路,只写了部分题的代码。

下午脑子状态不是特别好,晚上略显动力不足。

T4 原石贸易

感觉这种无限复制的思路很值得学习

套路地,可以想到转化为对于前缀和序列的操作,那么,如果是一条链的话,每次的操作就是交换相邻两个 \(s_i,s_{i+1}\),目标是使得 \(s\) 不降,这个的操作次数是容易的。

问题是现在是一个环,操作将变得不简单,当时大概想到这里就觉得这个有点不太能做了,就转而开始去径直地猜测一些贪心结论了。

(最后感觉了一下,觉得每次可以直接对负数进行操作,然后再怎么样给这个过程上一个 DS 优化)

但是问题不大,我们考虑直接硬做。

考虑类似 周末T4 infinite parenthesis sequence 的思想,把 \(a\) 无限复制,并求出一个前缀和 \(s\),此时,一次操作会对所有 \(\bmod n=i\) 的位置都合下一个位置交换,目的依旧是使得整体不降

\(R_i\) 表示 \(j>i,s_j<s_i\) 的数量,由于 \(s_n>0\),所以这显然是一个有限的数字,且 \(R_{i+n}=R_i\),想要所有的 \(R\) 都变成 \(0\),只需要将 \(R_{1\dots n}\) 变成 \(0\) 就好。

猜测 \(\sum_{i=1}^n R_i\) 就是答案。

证明:考虑一次交换操作,最多把某一个 \(R\) 减掉 \(1\) 且总能找到某一个操作使得其 \(-1\)

实际上,也就是每次操作一个负数位置即可。

写出 \(R_i\) 的计算式,知道 \(R_i=\sum_{j>i} \max\{0,\lceil\frac{s_i-s_j}{s_n} \rceil \}+\sum_{j>i} \max\{0,\lceil\frac{s_i-(s_j+s_n)}{s_n} \rceil \}\),注意这里每一个 \(j\)\(R\) 的贡献是可以 \(\ge 2\) 的,考虑这是一个无限的序列,但是每轮增加 \(s_n\)

此时,使用一个我第一次见的套路,去掉这个上取整。

\(p_i=\frac {s_i}{s_n}, q_i=s_i\bmod s_n\),那么上式就是 \(p_i-p_j+[q_i>q_j]\) 这种形式,注意如果 \(q\) 是负数,应当将 \(q\) 移动到 \([0,s_n)\) 的范围。

这个玩意,就可以上二维数点数数了, \(O(n\log n)\)

ARC076D Exhausted?

sol1:

回顾了一个重要结论:Hall 定理一个很有用的推论:最大匹配的大小为 \(|X|-\max(|S|−R(|S|))\)

求最大匹配,\(max\) 里面有减号,考虑取一个补变成加号

然后扫描线一下交集的左端点,线段树维护每一个右端点对应的答案。

sol2:

有些时候贪心是无法证明交换性的,一定要注意交换性是不是对的!即“我不要的你是否一定能拿到”——Charile

用反悔贪心来考虑,如果我有位置,我就暂时占着;如果我没位置了,那我就到前面去看看有没有适合抢的,如果有就抢一个,把多出来的那个塞到后面去。什么情况下“适合抢”呢?如果我的 \(R_i\) 要大于对方的 \(R_j\),那我确实更紧迫,留下我不如留下他,这个交换性是可以证的,所以我就可以把他换出来。剩下的右半部分照样处理。

CF725F Family Photos

大概是之前 7,8 月份讲题的时候讲师现场补充的题目,当时没有找到原题,今天倒是碰上了。

如果 \(a1+b1>a2+b2\),那么可以把选的先后顺序的限制当成不存在,拆成两个物品进行选择。

否则,当前 \(a1+b1<a2+b2\)

那么 \(a1-b2<a2-b1\),所以 \(A\) 认为后手可以更赚;同时 \(b1-a2<b2-a1\),所以 \(B\) 也希望后动手。

此时,注意到如果 \(a1-b2>0\),那么 A 虽然不能非常赚,但是至少可以吃一个低保,且由于此时可以推出 \(b1-a2<0\),所以 B 从始至终都不会考虑选择先手选这一组,所以 A 可以把这种全都留在最后选。

同理,B 可以把 \(b1-a2>0\) 的留在最后选。

结束了。

AGC023F 01 on Tree

考虑如果是逆序对最小的话,那么每次肯定能选 \(0\) 就选 \(0\)

那么可以考虑新建一颗树,仅有 \(a\)\(1\) 的点,然后每个点有一个点权,大小为选了这个点之后能继续选的 \(0\) 的个数,要求构造一个排列,满足选了父亲才能选儿子,使得 \(\sum i\times val_{p_i}\) 最小。

发现对于 \(val\) 最大的点,如果选了父亲,那么下一个肯定要选他,所以其实可以合并成二元组 \((2,val_u+val_f)\)

具体的,应该合并怎样的点对呢?

设两个节点(单个节点或多个合并的节点)分别为 \(a\)\(b\),设 \(a\) 节点包含的所有小节点中有 \(a0\)\(0\)\(a1\)\(1\)。同样地,\((b,b0,b1)\)

注意到这个时候,两个序列的合并一定是形如 AB 或者 BA,不会出现 A 的某一个元素插入进 B 的中间进行合并的情况。

分别考虑先选 \(a\) 与先选 \(b\) 造成的逆序对个数谁更优,当且仅当:\(\frac {a1}{a0}<\frac{b1}{b0}\) 时,先选 \(a\) 更优。

所以新合并节点的权值就是 \(\frac {cnt1}{cnt0}\)

Loj3366 [IOI2020] 嘉年华奖券

简单题,发现等价于钦定 \(\frac {nk}2\)\(+\)\(-\),错解不优啥啥的。

Loj2306 「NOI2017」蔬菜

蔬菜越来越多,我该怎么办?

时光倒流!每次贪心删去最菜的 \(m\) 个物品。

这样为什么对呢?因为前 \(p\) 时刻能选的,前 \(p-1\) 一定可以选到。所以直接对 \(p=10^5\) 求出答案,然后把过程中卖的所有菜从大到小排序即可。

这道题还有一个神奇的地方:我们的第一个猜测是前 \(p\) 天的决策是基于前 \(p-1\) 天的基础上的,但是这是错误的,样例就是反例;但是却可以证明前 \(p\) 天卖的总共的蔬菜一定是前 \(p-1\) 天卖的总共的蔬菜的超集。很神秘。

11.14

早上把昨天晚上一些没写的贪心题的代码写了。

做今天的看题赛,感觉今天的题目还是挺有收获

  • 说唱出门教学:再次提醒了这样一个并查集的思考,当时想题的时候大体都能想对,但是跳步长的方法是考虑的是 lower_bound,这样会导致复杂度多一个 log。其实这样一种并查集的操作很像 SA 的时候对于 height 的考量。
  • tree:乍一看是一个点分治模板题,注意到 \(q,k\) 范围不对劲,想到了可以拆成 \(O(qk)\) 个询问然后长剖回答问题。算是复习了一下长剖,感觉长剖其实是一个挺厉害的算法,但是忘的有点干净了2/3 月份还做过一个长剖的题来着
  • 种树:傻波数颜色板子题,有若干解法:dsu on tree/线段树合并/转序列问题然后上主席树或莫队/将同种颜色按 dfn 排序然后做树上差分。其中最后一种算是昨天才从 Charile 博客里面学到的一种,写了一下。
  • 瓦夜:提醒了注意一个 “所有修改都在询问之前” 的性质,最开始看题的时候看得太快了都没有意识到(。对于这种字符串问题,我们或许会格外在意是否在线,因为可能会使用 Trie/AC 自动机等结构,但是即使强制在线,我们其实也有二进制分组的手段。
  • 赤冬:挺厉害的贪心题。我还是想不出来贪心结论/ll

晚上挺摸的,虽然说白天状态也并不集中。不希望以这样一个姿态迎接周六。

怒其不争啊

11.15

打模拟赛,T2 图论又犯了一个 7/8 月分的某到图论题的错误,即没有注意到 一条边是否在路径上 是一个很重要的条件,受不了了。

下午本来在等 T4 讲解,结果最后还是只能自立更生(恼

晚上总算看懂了 CF1750G Doping,感谢 Alex_Wei 的题解

看了一道有点意思的诈骗题 CF1696D Permutation Graph

然后学习了一下 利用特殊的强制在线反解答案 的人类智慧...

晚上本来心情不错,漫无目的地在知识中游弋,感觉很爽。可惜不小心水了接近 30min,顿时斤斤计较起来,似乎有点患得患失了

T4 奥日与灵树之末

模拟赛,看到有两道原题,决心今天一定给 T4 干了

想了 2h30min 左右,得不到任何做法。

但是其实已经很接近了,也比较可惜,感觉想到后面确实有点无奈了,心态变化在所难免

感觉看起来就是一个线段树题不知道为什么组题人总是喜欢在 T4 放一个线段树,明明 T3 已经放了一个了,还要放

两部分区间合并有点困难,发现一个蓝树苗可能会影响到一条链的事件。

很快注意到这个结构是固定的,而且是一个树的结构。

但是贡献怎么计算呢?感觉非常难啊。

那么此时肯定需要探讨一下这棵树的性质,发现如果将连边视作区间 \([l,r]\),那么这些区间要么不交要么包含。

考虑修改/询问区间 \([l,r]\) 的时候,可以发现 \([l,r]\) 在 dfs 序上也是连续的区间。进一步地,可以发现 dfn[i]=n-i+1

但是还是不会计算贡献,思考部分分,如果没有修改的话,首先有一个弱智 \(m\sqrt{n}\log\) 的莫队,采用的答案计算柿子是 \(\sum [cnt_i\ge 1]\)

但是这个真的好弱智啊,带来的结果就是毫无扩展性。

思考 \(r=n\) 怎么做,发现此时一定包含根,有什么用捏?倒是可以把修改拆分成两次包含根的修改,有什么用捏?

核心问题是每一个蓝点的贡献太不独立了。

灵光一现地,想到了利用 dfn相邻两点的 lca 进行差分。

蠢笨如猪地,发现这个 lca 是动态的,那么每一个点的贡献还是没有独立出来,还是不好维护,那么这样看起来也不太行。

没办法了,给 T23 敲了。回来写暴力,分析了一下发现对于没有询问的情况,每一个点被染蓝的时刻是固定的,可以转化成为一个二维数点,但是依然是一个没有扩展性的做法。


一念之差啊。

solution:

这是一个套路,前天第一次学,昨天为了加深印象应用了一次,今天还是没有注意到。

经过一些讨论,发现对于询问可以:将 r+1 暂时视作蓝点,等价于求蓝点的虚树大小(当然要减去 r+1 的部分)

那么,线段树维护区间相邻两点距离和即可。修改是区间颜色翻转,这是简单的。

CF1750G Doping

代码还没写呢~~~

P8968 觅光 | Searching for Hope (hard ver.)

类似的题目:[CF1578J] Just Kingdom。但是利用二叉树的性质,更进一步地优化

代码还没写呢~~~

11.16

感觉做得挺快的,两个小时给 T123 干了,一个小时给 T4 干了,剩下的时间都在对拍

给 T3 拍出来一个细节写挂,好!可惜 T4 暴力都写错了/cf/cf/cf,同时造数据的方法过于随机,没拍出问题。

T12 都挺快,T3 着实卡了一会儿,很快可以转化到树上路径数颜色,但是这个玩意我不太会做啊

经过思考,首先给出了一个根号分治的做法,对于出现次数少的颜色,考虑 \(O(k^2log)\) 转为二维数点;出现次数多的,每次询问暴力问。但是问题出在这个 \(O(k^2)\)

看到部分分有一个颜色数量 \(\le 100\),发现可以 bitset。

但是脑子抽了,没有意识到 bitset 其实可以直接做异或的,发现如果直接处理点到根的 bitset 的化,那么并起来会多一个 lca 上方的部分。

怎么办呢,点分治,考虑将每一个询问挂在对应的分治中心上,那么就可以处理到分治重心的 bitset,然后每次询问的时候做 and 就好。

这样的复杂度是 \(O(n^2\log n/w)\),瓶颈在于对于每一个分治重心需要处理出所有的 bitset,可以加一点卡常,比如假如处理到一半就发现 bitset 里面已经有重复节点,那么剩下的肯定都不合法,可以不继续递归处理了。

bitset 支持异或操作/oh/oh/oh


T4

做了一会儿想起来是原题,但是做法忘了。

二分答案,然后转化为差分约束,这个部分还算容易。

那么,接下来,考虑人脑找正环。经过一通分析,得到了一个自认为非常正确的结论,但是事实上假的一把。

最后发现首先差分约束的图少连了 \((0,2n,Ans),(2n,0,-Ans)\) 的边,其次分析正环分析得一塌糊涂。

下午又自己重新分析了一下图上的正环,又得到了一个自认为非常正确的结论,但是还是假的,有点没办法,给 wyx、zqm 都讲了一遍我的思路,大家都没有发现问题。

那坏了,开始造数据,由于一直没有意识到完全随机造的数据可能强度不够,导致不得不把 n 调到 100 左右才得到一组数据。

yr 通过聪明的方法,增进了数据的强度,v 了我一组 \(n=7\) 的数据,很快就调出来了!

造数据应当考虑数据强度/oh/oh/oh


下午就在刚 T4 了,虽然说中间摸了一会儿。

晚上最开始在看列表新增的两道题,后面开始和 wyx 一起口胡 cf。

晚上玩飞盘,感觉大家压力都有点大,都带点戾气

CF1886D Monocarp and the Set

究极诈骗题,正难则反

正着做的话,只能设一个暴力 DP \(f_{i,L,R}\) 表示前 \(i\) 个数字值域 \([L,R]\) 的方案数

分析转移可以发现只关心 \(R-L+1\),于是可以改设 \(f_{i,len}\),转移的话,如果当前是 \(</>\),那么 \(f_{i-1,len}\to f_{i,len+x}(x>1)\);如果是 \(?\),那么 \(f_{i-1,len}\times (len-(i-1)+1)\to f_{i,len}\)

做到这里,似乎就没有办法做了,它甚至还带修。

solution1:

题中说是加数,我们就可以把所有的操作反过来,从 n 个数字中不断删除数字。

首先如果是 \(>/<\),那么就只能删除最大/小值,有一种选法。

当操作为 \(?\) 时,那么既不删除最大值,也不删除最小值,有 \(len−2\) 种选法,\(len\) 是数组长度。

这样的贡献是非常容易带修的。

solution2:

仔细领会刚刚的 DP。

发现 DP 做的事情实际上是,如果碰到一个 \(>/<\),那么将其放置到当前序列的最前/最后,并给后来的数留下确定的空隙长度;当最后到 \(f_{n,n}\) 的时候,自然可以反推出前面 DP 过程每一步放的位置的真值。

应对这种计算排列方案数的问题,一种非常有价值的角度是视作把一个一个数插入进已有的排列,而不是提前 reserve 好位置。

(类似的:排列之美

所以,考虑如果当前是 \(</>\),我们直接将其放置到序列的最前/最后,而不留任何空隙。否则,可以随便插入一个空隙,方案数是 \(len-1\)

CF1886E I Wanna be the Team Leader

上一道题给我自信打没了,这道题给我找回了自信。

首先容易猜测一个结论,同一组程序员的能力值连续。

那么,可以设 \(f_{i,S}\) 表示使用程序员 \([1,i]\) 处理 \(S\) 集合的任务是否可行。利用一点贪心结论,可以发现转移数量只有 \(20\),但是状态数有 \(O(n^2)\)

观察到这个 DP 状态是一个 bool,第一反应是改设 \(f_i=S\)

肯定不行,简单思考了一点其他的路径,发现都不太行,回头灵光一闪,发现可以设 \(f_s=\min i\),那么就结束了

CF1886F Diamond Theft

我果然不会贪心。。。

考虑对于固定的 L,R 怎么做,发现对于一类/二类摄像头,可以直接贪心得预先固定他们放的位置。

对于三类点,显然,如果要拆成两个的话,拆 s 更大的是更好的。

所以贪心地先尝试用 si 比较小的不拆,不行就拆。使用并查集维护下一个可以放的位置,这样是 \(O(n^3)\)

发现 R 显然可以二分,结束。

11.17

品味着心绪的不断变化,这几天,这一段时间,徘徊进退、时喜时悲、懈怠又奋起,三言两语怎说地尽。

感谢 OI。

还没有做完的事情:

  • CF1750G Doping
  • P8968 觅光 | Searching for Hope (hard ver.)
  • 神仙图论题
  • P8885 「JEOI-R1」子序列
  • [CF1106F] Lunar New Year and a Recursive Sequence
  • 葫芦娃救爷爷 网络图 么克斯马克思

希望,还有机会,回到机房。

posted @ 2024-02-29 21:45  _Famiglistimo  阅读(37)  评论(0编辑  收藏  举报