2022 8 月总结

2022 8 月总结

8 月前两周的融入了 2022 HL集训总结,这里从第三周开始写

8.14-8.15 ABC264 + UNR#6DAY1

ABCD 水题

E 套路删边转加边结束

F 把 DP 状态口胡出来了,然后写了半天没有写出来,被分类讨论卡爆了

题解的实现非常优雅,写 DP 的时候一定要搞明白状态之间的关系,不要想当然

G 联想到 [UOJ24 Rail] 口胡了一个自动机上跑最长路的算法,发现和题解是一个意思

Ex 树形 DP。观察到深度 \(<20\), 每次新加入一个点之后更新从这个点到根的链上的 dp 值即可。为了辅助 DP,自然想到需要记录儿子的 DP 和

周末玩的比较嗨,导致感觉不是很有状态,感觉脑子里面被各种奇奇怪怪的垃圾塞满了,GG

模拟赛(UNR #6 D1) 时间分配:

30min 纵览,发现看不懂 T2 题目,GG

2h T1,但是还是只会暴力。

最开始想到了可以把面基过程看成一个接力的过程,然后思考了一下 3 个点怎么做,4 个点怎么做。考虑了设 \(f[i][j]\) 前 i 个点汇聚于 j 。思考树的部分分,发现可以二分答案,考虑将二分答案套到图上面去,发现很像 My Beautiful Madness 对于 \(d\) 邻居的定义,但是然并卵。

思考边权为 1 部分分,发现并多个角度证明正解的第一个性质,即所有点会汇聚到一个点上,那么直接把一条边拆成三个点,枚举在那一个点汇集即可

考虑带权树的重心。回到 d 邻居的思考,发现条件不等价所有关键点都有交。思考如果在边上相遇怎么办,误以为可以枚举聚集点然后二分答案之后计算到达较早的点可以补的 DELTA 和最晚到达的点进行比较,但是发现没有正确性。

考虑这个方向不怎么走得通,但是找不到可以换的思路了。时间不多了,写了一个暴力跑了

1h T3

随手写了一个 \(O(qn^2)\) 的 DP,然后希求仿照 [JOISC]两道料理 进行优化但是发现有根本性矛盾 GG。

30min T2

总算是把 T2 题目读懂了,知道可以 DFS 10分 但是懒得打了

正解:orz ttd

T1:对每一个关键点跑单源最短路。枚举在 \((u,v)\) 上相遇,可以 \(2^k\) 枚举点走到边的哪边,然后取出两边需要时间最长的通过计算可以得到答案。

优化:发现每次都要取的是两边的最大的,可以直接排序二元组 \((dis[x][u], dis[x][v])\),然后枚举第一维最大值,与第二维的后缀最大值进行计算。

T2:神仙题,可以看作是 DP 套 DP

首先考虑有了一个最终串 \(T\) 怎么样判断是否合法

可以设 \(f_{i,j} = 0/1\) 表示 \(T\) 的前缀 \(i\) 能否被 \(S\) 的前缀 \(j\) 给构造出来

\(s[j + 1] == t[i + 1]\) 的时候 \(f_{i, j} \to f_{i + 1, j + 1}\)
否则若 \(a_{i + 1} \ge b_j\) ,那么 \(f_{i, j} \to f_{i + 1, j}\)

\(a,b\) 分别表示在 \(t,s\) 中左括号比右括号多的个数。

回到原问题,考虑设 \(dp_{i, j, V}\) 表示构造了目标串前 \(i\), \(a_i = j\),$f_{i, k} = (v >> k)&1 $

枚举当前填啥即可转移,答案 \(dp_{n + 2t, b_n, V}\) ,其中 \((V >> n) \& 1 = 1\)

每次只转移有值的 \(dp\), 卡卡常据说有 70

考虑优化状态,发现最后答案只关注最高的一位到底是啥,不妨最后一位只维护有值的最高位的位置

当前这位如果填左括号可以正常转移,在当前这位填右括号的时候会出现一点特殊情况

考虑当前 \(s[j + 1] \neq t[i + 1]\) ,当前是右括号, \(a_{i + 1} = a_{i} - 1\),所以可能出现 \(a_{i + 1} < b_j\) 导致无法转移的情况

自然想到通过换一个 \(j\)\(b_j\) 变少,也就是通过把 \(s[1\dots j]\) 的一个完美匹配的后缀用额外的机器人替换掉,使得 \(b_j\) 减少

预处理 \(pre_j = \max\{k | b_k < b_j, k < j\}\), 容易发现 \(b_{pre_j} = b_j - 1\)

所以此时就可以做转移 \(dp_{i, j, k} \to dp_{i + 1, j - 1, pre[k]}\)

具体写法可以看 ttd 的代码

为了方便理解,如果把状态设置成 \(dp_{i, j, k}\) 表示当前使用了 \(i\) 个额外的机器人,有 \(j\) 个额外的机器人已经出现,那么就应该转移到的是 \(dp_{i + (k - pre[k] + 1) / 2}\),因为使用了这么多个机器人去换 s 了

这种实现可以看 wyb 的代码/hanx

T3:

DP 式子的潜力已经到尽头了,我们需要换一种方法

考虑 \(q = 1\) 的部分分,考虑把相邻两个点看成一组,当前可以贪心地选择组内较大的那个,如果当前想要选择组中较小的一个,需要与之前选择的进行比较,做一个反悔贪心的意思。

扩展一下,\(l,r\) 乱动可以想到莫队,这个贪心只能加点不能删,考虑不删除莫队

发现每次如果只在前面一个点一个点地加入会产生不合法的情况,需要一组点一组点的加。

复杂度达到瓶颈,使用神奇的我不会的压位 TRIE 去优化反悔贪心所使用的堆,可以卡常卡过去

我并不知道的经典 Trick:分治

用主席树 \(T_1\) 维护 \([L,mid]\) 的贪心选了的值的位置,\(T_2\) 维护 \([mid, R]\) 没有选的位置。

考虑跨过 \(mid\) 的询问 \([l, r]\),相当于需要把 \(T_2\) 中一些没有选的位置替换掉 \(T_1\) ,可以二分出最大的 \(k\) 使得 \(T_2\)\(k\) 大大于 \(T_1\)\(k\)

2022.8.16 pb 组合计数

上午状态将就,疑似昨天晚上空调对着吹了一晚上导致肚子不舒服

感觉有时间的话可以把这次的组合计数和 HL 讲的容斥原理整合一下

今天是 zqm 给新初三的讲题,据说他们啥都会,感到非常惊恐,甚至还有新初二的直接当场切题,感觉自己学到狗身上去了。发现自己已经忘记了自己的学习进度,然后大致翻了翻提交记录,发现自己应该是新初二大致拉完普及,新初三拉完提高内容并去了 HL,初三一年在学习省选内容

感觉对于过去的记忆已经沦落到一片空虚的荒漠里面去的,但是即使记住了所有,不也还是一片虚无吗

一直都感到自己差点悟性,但这也是可以自我安慰的东西:我起步更晚,通过努力走到了现在

前行路上,不要忘了自己。

晚上状态不大行,有点瞌睡。先去简单准备了一下明天的讲课,然后盯着 [AGC012F] Prefix Median 看看不懂

[AGC021E] Ball Eat Chameleons

高级分类讨论题,思考了很久,虽然说思考状态不大行

naive:

感到题面非常申必,对着样例搞了一会才明白了到底在算什么,然后突然发现有英文样例解释/fn

知道是计数,然后想都不想直接尝试 DP,在设状态的过程中考虑到当前需要临界点的变色龙数量...之类。然后发现除非把整个序列记录下来,不然 DP 不动/fn/fn/fn

考虑到正难则反,想要计算不合法的情况,发现一条变色龙两种球吃得一样多的情况是非常重要的。以下以">"代称红球比蓝球多的变色龙,"="类似

发现 "=" 合法需要先填红色,即最后一个球需要是蓝色

联想到昨天晚上才做了的 UNR#6D1T2,知道可以先考虑给定了一个最终态怎么判合法

然后开始狂暴设出需要的未知量,狂暴模拟,狂暴贪心

设开局有 x 个 R,y 个 B,总共 \(a\) 个 A,b 个 B。
想要直接把 \(x\) 个 R 用于填充 "=",问题是会不会先填一个 B,或者说存在红蓝交替的情况会更优

"=" 的染色过程是 蓝->红->蓝->红 之类,考虑直接把使得他变蓝的蓝球 送给 ">",拿到下一个红球的时候再帮">" 拿回来。就是调整一下麻

然后考虑这个时候需要满足的条件。发现对于至多 \(a - b\) 个 > ,都需要多占用至少一个红球,那不妨贪心钦定只有一个 ">"

然后继续狂暴乱推发现陷入了乱设未知数的死循环,洗脸清醒了一下,决定重开一把再推一遍

一番推导之后,误以为 \(a > b\) 的情况下必然有解,误以为既然 ">" 可以狂暴背锅,那肯定问题不大。然后对于 a = b 的情况,想到了上一个折线法即可,但是折线大概是构造错了。

sol:

神仙 pb /bx

贪心策略想对了/hanx,具体的:

把第 n 个变色龙单独拿出来;拿到红球时,如果前 n − 1 个还有没变色的那就直接吃,否则喂给第 n 个;拿到蓝球时,如果前 n − 1 个有红色变色龙可以吃掉这个而不变色的那就吃掉,否则也喂给第 n 个。

可以发现期望情况下,\(n - 1\) 个只会有刚好一红一蓝两个球

问题在于可能出现一整个后缀全都是红球导致有些 "=" 只有一个球的情况,浪费掉了填写蓝球的机会,可能会导致 ">" GG

\(m\) 个位置只放了一个红球,若 \(a - m > b\) 合法,\(a - m < b\) 不合法

考虑 \(a - m = b\),若 \(a\neq b, m \neq 0\) 那么此时必然是不合法的

考虑此时的实际意义是 ">" 成为了一个 "=", 当然最后吃的球不是红色,所以最后一个球是蓝色的。根据上面的贪心策略,如果有一个蓝色球,而且此时有 "=" 存在浪费现象,我们会阻止他浪费。所以此时存在浪费现象的 \(m\) 个位置都没有放过红球,那么按照贪心规则,不可能给 ">" 位放红球。所以 ">" 位置只存在一个蓝球,显然是不合法的。

所以这种情况出现就是不合法的。

考虑 \(a = b, m = 0\) 的情况,意思就是说全是 "="。一个简单的思考是令 \(b = b - 1\),即取出某一个蓝球然后划归做

容易想到把红球看做左括号,蓝球看做右括号

仔细探讨的话,找到前 n − 1 对括号,剩下的都喂给第 n 个变色龙。如果第 K 个球是红球那么显然不合法,否则考虑它是否组成了第 n − 1 个括号。如果它不是第 n − 1 个括号的右括号,即喂给了第 n 个变色龙,那么显然是合法的;否则喂给第 n 个变色龙的球必须一个括号都组不出来,即‘BBB...BRRR..R‘ ,肯定不合法。

考虑 \(m\) 怎么求,发现如果出现了一对括号那么 m 减少,设匹配出 \(w\) 对,那么 \(m = \max\{n - 1 - w, 0\}\)

放进上面的式子,理想状态是 \(a - \max\{n - 1 - w, 0\} > b\),假装现在 \(a > b\),那么只需要满足 \(w > n - 1 - a + b\)

综上,对于 \(a > b\) 的情况,只需要括号数 \(\ge n - a + b\) 即可。对于 \(a = b\) 的情况,可以聪明地把 b - 1,或者说需要满足 最后一个球是蓝球,并且前 K − 1 个球能组出至少 n − 1 个括号

这个显然都是可以用折线法计算的。

具体的,向右走视作 \(R\), 向上走视作 \(B\),要求任意时刻前缀中无法参与匹配的蓝球数量不能超过 b - n + a - b = a - n 个。也就是不能走到 \(y = x + a - n\) 的上方,结束。

AGC052C Nondivisible Prefix Sums

/yqq 神仙题 /qq

pb 把这种叫做 不合法元素唯一, 还用到这个思想的是 「CSP-S 2019」Emiya 家今天的饭

考虑如果不能重排,那么方案数就是 \((p - 1)(p - 2)^{n - 1}\), 第一个随便选,后续为了满足限制都有一个值不能选

考虑加入重排,发现由于重排的方法太多了,根本去不了重,所以不能仿照 [HL 集训]数数 的方式,根据一个合法 的来计算有多少个排列可以通过重排合法。

考虑换一个思路,考虑如何重排。一个 naive 的思考是,顺次做,能选就选,不能选的话就找一个序列后面的不同的数和当前数进行交换。当然这个思考是破败的。

最后如果选完了那就说明排对了,否则会剩下一坨相同的数 或者 \(P|sum\)

我们想要剩下尽量少的数,由于 \(P\) 是质数,所以不妨假设全局严格众数为 \(1\)(可以循环平移)。那么想让 \(1\) 尽量少

初始可以直接放 P − 1 个 1 ,然后每放一个 x ,就可以放 P − x 个 1 。如果到最后还剩下 1 那么就显然不合法了。

但是这个做法不一定有正确性,会不会出现其实最后剩下的数字根本不是 \(1\) 呢,会不会可能说我 \(1\) 消过头了导致到了后期根本没有必要消了?

我们可以使用贪心策略使得上述思考有正确性

每次贪心选择剩下最多的数字 \(x\),如果能填则填,不能填的话找到后面出现次数第二多的数字 \(y\),先填 \(y\) 再填 \(x\)

因为 \(x + y \not\equiv x\), 所以这样填是对的。这个贪心策略显然是正确的。

发现最后会 GG 当且仅当最后发现还剩下至少两个 x 且 x 不能填(判掉 \(p|sum\) 的情况所以需要两个)

考察这个贪心策略,发现对于任意一个元素 t ,如果初始时它的出现次数最多,那么在过程中它的出现次数不会比最多的少 2 。

所以最后剩下的 \(x = 1\),证毕

那么做一个背包就好了,物品重量为 \(p - x\)

8.17 wyb 杂题 + pb 杂题

选题针对的是新初三,而且是按照新初三都会觉得很难的标准来选的题,但是有新初一初二的在听,那不就是直接 GG /lh

新初三好强,我那种语速都能够听懂,甚至 bxy 还指出了我的错误,好强,感觉 fzoi 未来有希望了。

下午继续看 [AGC012F] Prefix Median,总算是看懂了,原来是昨天晚上一个细节看错了

晚上比较颓废,回家之后狂暴划水

[AGC012F] Prefix Median

道道都是神仙题/bx/bx/bx

\(a\) 排序并假装 \(a\) 中的数字都是不一样的

首先考虑给定 \(a, b\),如何判断 \(b\) 是否可以通过 \(a\) 重排得到。首先 \(b_1 = a_1\)

考虑对于 \(b_{i + 1} > b_i\),我们需要两个 \(\ge b_{i}\) 的数字来撑场面

我的贪心:选择 \(b_{i + 1}\) 和最小的 $\ge b_i $ 的数。这样贪心的问题在于虽然给后续留下了更多的撑场面的数字,但是可能导致必选的 \(b_{i + 1}\) 之前选过了,可能选择了一个 \(b_i < x < b_{i + 1}\) 的数字,导致当前的 \(b_{i + 1} = x\)

设已经使用的 \(a\) 的集合为 \(S\),把 \(b_i\) 抬一步只会抬到 \(S\)\(b_i\) 的后继

回头看一眼,发现应该选择的是 \(\ge b_{i + 1}\) 的数字才对/qd。修一修,那能不能选择 \(b_{i +1}\) 的后继呢?毕竟我们想要留下尽可能多的较大值“撑场面”

题解的贪心:简单分析可以知道 \(b_i\in[a_i, a_{2n -i}]\) ,随着 \(i\) 的增大取值范围不断缩小,所以可以用来撑场面的值是刚好够用的,可以直接选择当前没有进 \(S\) 的最大值。

思考我的贪心存在的问题,不合法的情况只会是 \(b_{i + 1}\) 的后继 \(x\) 之后,在未来某一个时刻出现 \(b_{i + 1} < b_{j} < x < b_{j + 1}\) 导致 \(j\) 被卡住的情况

c, 问题来了,那么这个时候 \(b_j\) 应该成为 \(b_{i + 1}\) 的后继啊。注意 \(x\) 只能从不在 \(S\) 的里面选,所以此时 \(b_j\) 应该是在 \(b_{i + 1}\) 之前被插入,所以实际上也没有问题/jk

c,问题来了,我们还有 \(b_{i + 1} < b_i\) 的情况,此时我们需要两个数拖后腿,我的贪心的选法可能导致找不到可以拖后腿的数而 GG。但是题解的贪心方法由于对于 \(b\) 的取值范围的优雅分析,可以发现如是选是恰好可以满足的。

所以最后的贪心方法是:

  • \(b_i < b_{i + 1}\),那么把 \(b_{i + 1}\) 和剩下的最大值加入 \(a\)
  • \(b_i > b_{i + 1}\),那么把 \(b_{i + 1}\) 和剩下的最小值加入 \(a\)
  • $b_i == b_{i + 1},那么把剩下的最大值最小值都加入 \(a\)

分析上述操作所需要满足的条件,\(b\) 能被 \(a\) 通过重排而得到当且仅当

  • \(b_i \in [a_i, a_{2n - i}]\)
  • \(b \subset a\)
  • \(\forall i \in [1, n), \not\exist j < i, s.t\ b_i < b_j < b_{i + 1} \vee b_i > b_j > b_{i + 1}\)

特别注意这里只关注 \(j < i\),不然还没有加入集合,是不会跳到的

通过上述分析可以验证这三个条件是充分的

发现第三个限制非常难蚌,现在的考虑是从后往前做,维护当前 \(b\) 的合法集合 \(S\)。初始 \(b_n = a_n\),合法集合里面只有 \(a_n\) 一个数字

每次会让 \((b_i, b_{i+1})\) 中的数字不合法,即所有 \(b_{1\dots i - 1}\) 都不能选择这些数字了。
每次会往合法集合里面加入 \(a_{i}\)\(a_{2n - i}\)

每次需要选定 \(b_i\),可以从合法集合中随便选一个。我们考虑使用 DP 去计数这个东西,发现我们只关注合法集合中有多少个数小于 \(b_i\) ,多少个数大于 \(b_i\),从而进一步转移。

所以设 \(f_{i, j, k}\) 表示选完了 \(b_{i\dots, n}\),有 \(j\) 个数可选的数字比 \(b_i\) 小,\(k\) 个大。注意在 \(a_i == a{i + 1}\) 的情况下,不会使得 \(j\) 增大

\(O(n^4)\)

[AGC008F] Black Radius

naive:思考重合现象,每一个点只需要覆盖到最深的叶子就可以了。还是会算重(恼

换一种思路,考虑判断合法,太难。

考虑只做到最浅的叶子,但是会算漏?所以对每一个点应该是计算到最大的 \(d\) 使得中心不会改变。

一个连通块多个中心?算重了?中心最多两个,对应偶直径的情况,考虑单独计算偶直径方案数

此时肯定不会算重了,但是这个 \(d\) 咋算啊

可以考虑二分一下然后算一遍直径?小优化:dfs 求出最浅儿子,设最浅儿子的深度为 \(d\),那么想要求的 d 只能是 d/d+1,判断一下即可 \(O(n^2)\)

猜想到换根,思考什么时候可能 d + 1,思考 d + 1 是否和偶直径的关系

不能 d + 1 的意思是会跑,会跑等价于偶直径/不是中心。

如若移动方向的点和子树外的叶子距离都为 d + 1,和字数内距离都为 d,出现双子星现象

考虑若不是中心,那么新中心需要满足可以找到与 (x, d + 1) 的等价 \(d^{\prime}\),所以是双子星????

c,感到迷惑,审视双子星现象,发现等价于中心在边上

所以实际上不需要关心是不是存在 d + 1 的情况, d + 1 的情况可以被边算到?

但是这个 d 咋求啊,感觉有点换根的意思在,但是好奇怪哦

思考了一下,感觉换根直接秒了?所求的就是以这个点为根的最浅的叶子的深度,记录一下子树内最浅的和跟最浅的不在同一个子树的次浅的,感觉就可以做了。

考虑边的情况,需要的是子树内的最浅浅于子树外的最浅,不然中心就不是这条边了。好像同时要求子树内有好点?

然后去看了一眼题解,发现错的有点多,GG

sol:

首先应该是使用 mxdep 来进行判断而不是使用 mndep 来判断。因为虽然可能卡了,但是依旧是中心,上面一个所谓的“小优化” 直接带偏了下面的思考。

分 x 是点还是边讨论。
如果 x 是连接 u, v 的边,且 mxdep_u ≤ mxdep_v,那么显然我们要填满子树 u,然后再延伸到 v,否则 x 就不会是中心。于是当 \(u\) 子树内有好点的时候它对答案有 1 的贡献,否则没有贡献。

如果 x 是点,盲猜合法的 d 一定组成了一个区间。我们分两种情况讨论。

x 是好点:此时显然下界为 0。设以 x 为根的时候 x 的儿子分别为 u1, u2, · · · ,那么上界就是 mxdepu 的次大值。

次大值:直径一定是由最大值和次大值组成的,当 d 超过次大值,中心就偏移了

x 不是好点:此时可以发现上界没有变化,而下界则成为了 min{mxdepu|v ∈ treeu, v is good}。

于是做一遍 O(n) 的树形 DP 即可。

8.18 zjk 杂题选讲

由于昨天晚上过于颓废,导致今天上午的状态并不是很好

中午配置了一下桌面,配了一半觉得好麻烦啊,但是又不能卡住不配了,qd

下午沉浸式切题,感觉做题的时候还是有点急躁了,没有静下来,导致有点暴躁。对比同桌 pt 12.9kb 的沉稳,自愧不如

晚上有西瓜吃/se/se/se

[HNOI2015]落忆枫音

非常喜欢题目背景!!!

是啊,就是这样。脉络树并不是唯一的。只要有一些微小的偏差,脉络树就可能差之万里,哪怕是在这同一片枫叶上。就像我们的故事,结局也不是唯一的。只要改变一个小小的选项,故事流程可能就会被彻底扭转。

所有的脉络都不会永恒存在,也不会永恒消失。不管是脉络树上的脉络,还是之外的细小脉络,都是如此。存在的脉络可能断开消失,消失的脉络也可能再次连接。万物皆处在永恒的变化之中,人与人之间的羁绊也是。或许有一天,我们与大家的羁绊也会如同脉络一样,被无情地斩断。

就算脉络断开,也有可能还会有新的脉络树,也还会与枫树的根相连。这样的话,我们的羁绊仍然存在,只是稍微绕了一些远路而已。无论如何,我都不会离开你的。因为你是我穷尽一生所寻找的,我的真恋啊!

我的思考:

如果还有其他入度为 0 的点那么直接 G

发现正着 DP 可能会出现抢儿子的情况。简单推了推什么时候会抢儿子,画了画图发i西安可以反向思考,这个过程可以理解为选父亲的过程

如果加边之后还是 DAG, 那么答案就是 \(\prod deg\)

考虑形成了一个环,可以把这个环单独缩成一个点,内部答案为环长,外部依旧是随便选

然后就做完了?

问题在于可能存在复杂环,那么复杂度可能有点问题而且实现会有点困难,GG

sol:

考虑 DP 处理复杂环的贡献,即考虑计算出所有不合法的贡献

对于一个环 \(a_1, a_2, \dots ,a_k\),一共会产生 \(\dfrac{\prod deg}{\prod deg[a_i]}\) 的贡献,环内部显然只有一种方案

设新加边 $(x,y), 设 \(f_i\) 表示从 \(x\) 走到 \(i\) 形成环的上述贡献总和,有 \(f_i = \frac{1}{deg_i}\sum f_v\), \(f_y = \frac{\prod deg}{deg_y}\)。相当于是处理了复杂环的问题。

也就是说出现环当且仅当给每一个点选定入边之后可以从 \(t\) 走到 \(s\),求从 \(t\) 走到 \(s\) 的方案数。同时因为 t 到 s 的路径上的点都是环上的点,要除去 \(deg_i\) 的贡献

\(O(n)\)

「2020-2021集训队作业」如果会出题就好了

naive:

首先考虑部分分

subtask1 支持 \(O(qn)\) 爆艹,那就爆艹

subtask2 没有换根操作。可以 dfs 预处理之后上一个树剖什么的

subtask3 单点询问。发现 \(f(x)\) 会变化当且仅当根出现在子树内。可以用类似换根 DP 求出每一个点忽略某一个儿子的时候的 mxdep,每次询问只需要找到对应的儿子是哪个,可以倍增从新根往询问点跳

subtask4 树高 log。同样注意到 \(f(x)\) 会变化当且仅当根出现在子树内,所以换根此时最多影响到 log 个祖先。同时链长 log,可以暴力遍历整条链。

subtask5 无性质。考虑每次 delta 是一条 1 到根的链,考虑两个点之间只存在一条路径,考虑异或和的询问等价于 1 到根的链的询问。

考虑把询问离线,考虑配合 DS 维护根从 \(u\to v\) 的变化之类。不大行

考虑如何从树高 log 的做法扩展一下。考虑点分树,还是不行

看一眼题解 想要树高尽量低,不一定以 1 为根,可以考虑以直径为根

考虑此时的性质,所有点的的深度 \(\le d\),在双子星时有且仅有一个子树 \(\le d + 1\)。当 \(d\le log\) 的时候已经会做了,考虑 \(d > log\) 会有什么性质

此时出现 \(n/log\) 个子树?寻找子树个数有关算法?否,应为至少存在两个子树 \(> log\)

ccc,想了好久但是感觉还是没有思路!!!

考虑 LCT ,不太会,ban 掉。

回到原问题,仔细思考,发现似乎没有必要把当前根到原根都更新,只需要更新到询问点对的 lca。

lca 在外面,这种好事。lca 在子树中,这种好事,lca 需要更新,ccc

思考能不能快速地算出来新值,感官上似乎可以使用广义的矩阵乘法来做,但是只是感官上

考虑是否存在询问铺满整条从当前根到原根的路径的情况,但是这种好事自然是难以发生的。

再次考虑是否能够利用上一次询问所得到的信息,即离线做法,还是想不动/fn

再次考虑 LCT,好像可以 LCT 维护子树信息?是不是在 access 的过程中更新就可以算出新值了?

不知道不是很懂,假装真的算出来了,但是如何快速维护点到根的异或值和?(恼

ccccccccccc, 发现(视频中有老哥提到了这个思考)之前想的:

考虑把询问离线,考虑配合 DS 维护根从 \(u\to v\) 的变化之类。不大行

其实是可以的,mmp,今天状态确实不好。最开始在想 subtask 的时候知道换一步根只会动 \(O(1)\) 个点,然后想着想着就变成了即使只换一步,也会动到原根的路径上的所有点,这样当然做不了了!=

cccccc,我真的 sb,这把我只能说是亏炸了,想了这么久。主要是最开始真的困,整个人都是麻的。

zjk:在线做法,配合 O(1)-O(N) LCA 做到 \(O(n)\)

假装直径中心在点上,考虑求出以直径中心 \(u\) 为根的 \(f\)

考虑换根到 \(x\),唯一影响是把 \(u\to x\) 这条连上所有 \(f(v) = dis(v, u) + l\), 其中 \(l\) 是直径长度的一半。

可以预处理出点到根的 f 的异或和,那么只需要求出 \((a, b)\)\(u\to x\) 路径上的交,新贡献是对于 \(l + dis\) 一个等差数列的异或和,也是可以预处理的

我的评价是好妙啊,观察到每次换根之后 f 的变化会非常申必,通过选根直径终点的方法,完美地利用了直径的性质。这个想法大致可以从直径的求法中联想到,一般在使用 DP 求解直径长度的时候就是用两条到叶子的路径拼起来

反思:

  • 不要完完全全虚空想题,虽然这样确实更加考验思维,但是正因为如此非常容易导致想歪/想漏。
  • 今天上午状态实在拉跨,晚上不要再沉迷游戏了!

bugs:

当然是写我自己想到的想法啦

  • BIT 做前缀和得到的就是需要的值了,不需要 ask(x) - ask(x - 1)
  • 维护点到根路径上的异或和,会使得 lca 处也被异或两遍
  • 注意分析过程中 \(u\) 的 f 值的变化。solve 到 u 时,应代表为根的时候的值。进入到一个子树,应代表走除了这个子树以外部分的值。回溯的时候,应该回复到走以 1 为根的子树的值。
  • 树剖斜挂/jk

[fzoj4514] 海亮集训 zjk T3

naive:

又是本质不同子序列/tuu,想起了上次考试被支配的恐惧

但是这次知道怎么暴力算了/hanx,所以我们有 \(O(n!ns)\)

发现只关注奇偶性,所以可以稍微优化一下这个玩意。众所周知,本质不同子序列的求法有两种,一种是 \(f_i = 2f_{i - 1} - f_{fail}\),另外一种是 \(f_{i, c} = f_{i - 1, c}, f_{i, s[i]} += f_{i - 1, s[i]}\)。这里显然选用第二种,因为第一种涉及到拼接之后本来没有 fail 的出现 fail 的情况。

但是可以预见的是,这样的情况只会发生 \(O(|\sum|n)\) 次,可能有做的空间

使用第二种转移,由于只关注奇偶性,所以 \(f\) 值也可以在 \(\mathcl{F}_2\) 域下运算,所以可以把一个字符串抽象为输入 \((0/1,0/1,\dots,0/1)\) 出来 27 个 \(0/1\) 的黑箱,最后一个表示方案数的奇偶性

可以想到类似 mtim 的思想枚举前 n/2 个的排列,计算出每一种输出状态的方案数然后枚举后半部分计算

状态数好大 /jk/jk/jk,但是字符集又压不下来

考虑第一种转移怎么做,直接套用上面的做法会发现没有本质的优化。感觉这种转移的奇偶性存在一定的规律。

发现好像如果 \(f_{fail}\) 是奇数,那么后续所有 \(s[i] == fail\) 的位置都应该是奇数

所以我们关注一个串末尾奇数 fail 的数量,同时这种奇数关系是有传递的,本来是偶的位置可能改变

c, 好难,感觉有点奇怪,这样说,岂不是所谓有位置都应该是奇数种方案

哦不对,在字符第一次出现的时候会变成偶数。那么这样的话偶数不会很多。

c, 不会做了,听讲解。

sol:

非常巧妙,结合上述两种 DP 方式,设 \(f_i(c)\) 表示当前以 \(c\) 结尾的子序列数量(第二种转移),\(s\) 表示总的子序列数量(第一种转移)

初始 \(s = 1, f_{c} = 0\),每次加入一个 \(c\)\(f_{i +1}(c) = s, s_{i + 1} = 2s - f_i(c)\)

md, 非常的有道理,充分结合了上述两种做法的思路,md,真 tm 强大

由于是在模 2 意义下进行,所以实质就是交换了 \(f, s\)

所以任意时刻,\(f(a,b,c\dots z),s\) 中有且仅有一者为 1,其他都是 0

对比之前的状态,现在的状态只有 27 种,延续之前所谓“黑箱”的思想,以对于每个串处理出如果之前的串状态为 state,将这个串加在末尾后的状态。

然后就可以设 $dp_{S,state} 表示用了集合 S 中的串拼接,当前 dp 状态为 state 的方案数,直接做即可,有一点 DP 套 DP 的味道在。

/bx/bx/bx/bx/bx

8.19 zjk 杂题选讲

今天上午有一点小困,但是还行,大致听懂了 ttd 讲的 D 然后就跑了,因为后面的题都没有看过题,直接听没有价值

感觉这种讲题方式的价值在于更通俗一点,相当于是资源。然而题量过大,不可能有足够的思考(一道题至少给个 40min 把),那么就只能通过看录像了。但是这个录像音频确实垃圾,极大削弱了价值

上午剩下的时间看懂了 DEI /fendou

上午睡了 20min,中午睡了 40min,下午很爽

包老师居然看不懂 T4 的题意,讲了半天才明白/jk

c, 一口好奶,下午听音乐听了一会儿就开始犯困/jk

[FZOJ3475] 海亮集训 zjk T4

小吨有一个个点的完全图。这个图里的每条边都有一个属于 \([1, 3000]\) 的颜色。
这个完全图有一个特殊的性质:对于这个图里的每一个简单环,都存在两条相邻的边,他们的颜色相同。
对于一个关于点的集合 \(S\),定义 \(f(S)\)\(S\) 最大的的子集 \(S^{\prime}\) 的大小,使得 \(S^{\prime}\) 中的任意两点之间的连边颜色都相同。
现在,小吨想要知道 \(\sum_{S \subseteq \{1,2,\dots n\}} f(S)\)
\(n\le 3000\)

naive:

考虑一个合法 \(S^{\prime}\) 的贡献次数,可能会出现争宠的现象,难以解决。考虑每次加入一个点之后的影响,GG。考虑缩点,G。

下面考虑加入特殊性质之后思考。在草稿纸上乱画了一下 n = 3/4/5 的情况,根据特殊性质试图推导出二级结论之类,狂暴假设法。

有点自闭,考虑使用冥想法,摘掉眼镜闭上眼睛思考;考虑使用以头抢桌法,猜一猜结论。

嗯...一个集合内部可以看作多个块...考虑我如何和这个特殊性质对着干...嗯...我尽力走颜色不同的边,同时守住这个性质...一定可以找到不合法...强制合法....嗯...考虑提出两条相邻颜色的边的中点,他需要满足什么性质呢.....zzzzz

好怪哦,再看一眼。似乎存在一个结论,即必然存在一个点所有出边的颜色相同。

简单的证明是反证法,如果不存在这样的点,那么此时我随便从一个点开始走,每次肯定可以找到和入边颜色不一样的边,走过去就好了。这样一定可以构造出一个环,同时不存在相邻两边颜色相同。

这一个点出边颜色相同可以使得所有经过这个点的环满足题目限制,但是无法保证所有的环。

粗糙的想法是再来一些出边颜色相同的点,但是真的好粗糙。

聪明一点,可以考虑到把当前这个点删掉,那么剩下 \(n - 1\) 个点肯定也有这个结论

然后 ttd 开讲了/bx

sol:

结论猜对了!但是我那个证明显然是错误的,因为没有考虑到环的起点的问题。上述的寻路方法,可能导致起点的入边和出边颜色相同。为了使得二者颜色不同,想要的是确立出边之后,确立另外一条和出边不同颜色的边作为入边,但是问题是环可能并不包含起始点。

所以还是要理性证明一下,我的想法只能作为感性理解了/qd(感谢 ttd 的指正)

结论:把点重编号之后,点 \(i\)\(i + 1, i + 2, \dots n\) 的边的颜色相同

使用数学归纳法,考虑 \(n = m - 1\) 时满足结论,考虑加入一个点 \(m\)

  • \(i\in[1, m - 1]\)\(i + 1, i + 2, \dots m - 1\) 的边的颜色都是 \(a\)
    • \((1, m)\) 颜色也是 \(a\),结论成立
    • \((1, m)\) 颜色为 \(b\)
      • \(m\) 所有边都是 \(b\) 结论成立
      • 否则不存在颜色 \(c\) 的边,产生三元环 \((1, m, x)\) 不符合大前提。
  • 否则,设 \(1\) 连出的边都是 \(a\), 则 \(m\) 连向 \([2, m - 1]\) 的边只能为 \(a/b\)\((1, m) = b\)。考虑此时 \(m\) 连向一个点 \(x\),边 \(a\)
    • 若存在 \(1 < u < x\)\((x,u) != a\),那么 \((1,m,x,u)\) 不符合大前提
    • 否则,\((x, x + 1\dots m) != a\) ,那么 \((1,m,x,x+1)\) 不符合大前提

orz zjk

考虑使用类似拓扑排序的方式提出一个序列 \(p_i\),满足 \(p_i\)\(p_{i + 1}, p_{i + 2} ,\dots n\) 颜色相同。
\(col[i]\) 表示 \(p[i]\) 对应的颜色

可以发现的是,对于一个集合 \(\{a_1, a_2, a_3, \dots, a_k\}\),只需要满足 \(col[a_1] = col[a_2] = \dots = col[a_{k - 1}]\) 就是合法的, \(col[a_k]\) 无所谓
一个 \(f(S)\) 就变成了(众数 + 1)

考虑依次加入 \(p_i\), 计算 \(a_k = p_i\) 时的答案总和。考虑倒序枚举众数 \(t\)

\[\sum_{t = 0} ^ {i - 1} (lst - \prod_{j = 1} ^ {i - 1} \sum_{k = 0} ^ {t - 1} \binom {cnt[col[j]]}k) \times (t + 1)\\ lst = \prod_{j = 1} ^ {i - 1} \sum_{k = 0} ^ {t - 1} \binom {cnt[col[j]]}k \]

其中 \(cnt[c]\) 表示颜色 \(c\) 在前 \(i - 1\) 中出现的次数。注意 \(k\) 只到 \(t - 1\)

lst 的意义是众数 \(\le t\) 的方案数,初值为 \(2^{i - 1}\),后续求和式计算的是众数 \(\le t - 1\) 的方案数

这是一种非常有趣的计算贡献的方式,即在需要得知具体为 \(k\) 的方案数时,可以先计算出 \(\le k - 1\) 的方案数,然后用 \(\le k\) 的方案数减去 \(\le k - 1\) 的。此时也为了计算 \(k - 1\) 的方案数铺好了路

暴力计算总复杂度是 \(O(n^4)\) 的,发现后面 \(\prod\sum\) 和前面枚举的 \(t\) 实际上关系不大,同时 \(\prod\) 的枚举实际上和 \(i\) 在外层的枚举是重合的,同时每次只会让 \(cnt[x] + 1\)

于是可以设 \(g[t]\) 表示 \(k\le t - 1\)\(\prod\sum\) 值。计算 \(cnt[col[j]] + 1\) 之后 \(\sum\) 的新值和旧值,除去旧值后乘上新值即可。

\(O(n^2)\)。注意这步对于求和式的观察是非常优雅的。

「2020-2021 集训队作业」Substring Concatenation

ccc,先复习了一下 SAM 的构造,感觉这篇博客写得很好/hanx,但是还是花了较久的时间去理解

naive:

我会 SAM!直接暴力枚举 \(T\) 串,借助 SAM 判断贪心判断是否可行即可。

具体的,如果当前串的 SAM 的 \(ch[u][c]\) 为空,可以直接暴力接到下一 SAM 的所有 \(ch[x][c]\) 指向的位置,位置可能有多个,找到一条可行路即可。否则直接接着走就好了。

然后就不会了/qd

sol:

考察这个暴力判断的过程,发现可以直接就着这个多个 SAM 连接出来的大 DAG 做 DP,因为连边是贪心连边的,不会在能走当前 SAM 的情况下走下一个 SAM,所以实际上就对应了 T 的构造过程

这样做到的复杂度是非常高,因为首先建图复杂度有点问题,因为缺少儿子的时候可能会对应多个下一个 SAM 上可以转移的点。一个聪明的办法是对每一个 SAM 建立字符集个虚点,那么这样复杂度就是边数 \(O(\sum s_i |\sum|)\) (其实也不大聪明)

此时在转移的时候,\(f_u += f_{ch[u][c]}\), 而后缺少儿子就去嫖虚点,可以注意到实际上代表字符 'c' 的虚点的意义就是后续所有以 c 开头的方案数

一个更为聪明的统计方法是,因为本来 SAM 的边是很少的,很多边都是额外填上去的,所以我们可以记录 val 表示所有“虚点”的 dp 值的和。而后每次变成了 (val - 存在的儿子对应的虚点的 dp)+ 存在的儿子实际 DP 值。存在的儿子很少,所以复杂度就降下来了。

\(O(\sum s_i \log m)\), \(log\) 是用 map 来存 SAM

[CTS2021] 数组

这道题直接看的题解/qd

解法类似于 DP 套 DP,只不过套的 DP 被数学知识代替了

最后一定长成 = 和 > 交替出现的情况。= 表示 \(a_ia_{i + 1} = b_i\)

一段等于的区间,设左端点为 \(x\),区间最小价值和可以表达为 \(ax + \frac bx\) 的形式

那么可以预处理出 \(l[i][j],r[i][j],s[i][j]\) 表示这个区间最优解的左端点值,右端点值,总和。

\(f[i][j]\) 表示划分出来的最后一个区间是 \([l,r]\) 的最小值,转移关注是否满足 \(b_{i - 1}\) 的限制,容易发现可以用双指针做

一遍过了,码力有所提升

8.22 ABC + jiangly

被 EF 打爆了,做 E 的时候很慌,考虑容斥发现不会算然后直接 G 了,赶紧跳

跳到 F,口胡了一个 nd^3 的 DP 没看出来可以前缀和优化,又去考虑容斥等奇奇怪怪的东西然后还是不会,GG

回头看 E,心态已经出现问题了。

发现 zqm 交了一发 E 但是 T 了,询问了做法之后,上网查了查怎么用 pair 作为 unordered_map 的 key 但是本地还是跑了很久。

最后 20min 看 G,最开始想的是线段树合并/分裂,但是很难写。想了想感觉可以暴力线段树区间合并,但是没有时间写了。

发现 zqm E 题手写一个 hash 表能过,直接贺了。

实际上 map 能过,应该使用 mp.find 替代 mp[],不然会因为空间而爆炸

然后贺题被 zex 抓住了,被 zex 狂暴嘲讽。我贺题是我不对,但是你言语没个轻重真是个 sb。经过反省之后觉得虚荣心真是可怕

贺题相当于否定了前面的所有努力

一个上午都在写 F 的前缀和优化,调了 4h 真的是吐了,感觉这种前缀和优化每次写的时候都写不对,一生之敌。下午学习了 hs 的代码,发现我的实现非常丑陋

下午订正 G,调了半天发现是 memcpy(a, b, sizeof(a)) 的时候 a 是 int 但是 b 是 long long

c,咋一天到晚都在犯这种 sb 错误啊。

CF1515H Phoenix and Bits

调傻了,周六就写完的题,今天才调出来,发现是线段树 pushup(rt) 写成了 pushup(x), \(x\) 是权值之类

为啥今天一直在犯 sb 错误啊,只能说是锻炼了我的耐心/ll/jk

首先可以干掉 and, 因为 a & b = ((a) | (~b)),取反等价于 \(\oplus 2^{20} - 1\)

显然是 DS 题。发现 \(l, r\) 的限制是针对值域的,可以考虑值域线段树(Trie)

发现 xor 操作是容易的,如果 x >> dep & 1,那么只需要交换儿子

or 操作可能会把左儿子往右儿子合并,这个操作发生当且仅当

  • rt 子树内同时存在左右儿子的位置会被 or 操作到

否则,这个操作的意思是把一些左儿子换成右儿子,可以使用异或打标记实现。waring,设原本异或 \(x\),那么此时应该异或 x & 存在左儿子的二进制,不然导致把一些右儿子交换成左儿子

线段树每个节点维护 vl, vr, cnt 三个值。叶子节点时 vl = ~x, vr = x, cnt = 1

void pushup() {
    cnt = l.cnt + r.cnt
    vl = l.vl | r.vl;
    vr = l.vr | r.vr;
}

所以如果 rt 子树内同时存在左右儿子的位置会被 or x 操作到,那么 \(x \&\ vl[rt] \&\ vr[rt]\) 非空,也就是

if(!(x & vl & vr))
    return upd(rt, x & vl, dep), void();

注意到 upd 的时候会导致 vl, vr 变化,但是显然是不能够直接 vl ^= x 之类,因为 vl = a | b 之类,而 (a | b) ^ c != (a ^ c) | (b ^ c)

于是需要使用一点位运算技巧

int L = vl, R = vr;
vl = (L & (x ^ U)) | (R & x);
vr = (R & (x ^ U)) | (L & x);

咋理解呢,一个方案是把位运算拆成集合的形式然后利用一些恒等式严谨证明(虽然我没证出来。
感性理解就是感觉就很对,思考第一种方式为啥不对,发现是因为可能存在 x = a | b 之后 x 某位 = 1,异或 1 出来变成 0

而第二种方式就巧妙地纳入了这种情况,对于 L 而言,就是 R & x 的部分,R 的在 L 下的意义是记录 a b 中至少有一个某位为 0 的位置

当然还有一点细节是,在把左子树合并到右子树的时候需要先给左子树打一个 1 << rt 的 dep 的异或标记,虽然不会对子树交换,但会修改 vl 和 vr。

分析一下这样做的复杂度,上述的位运算操作保证了如果要合并左右子树,那么必然是能够找到具体想要合并的位置而不会找空之类,点数 nlogV ,每次合并之后不会新增点,复杂度顶天 \(nlog^2V\).

(虽然感觉严重跑不满,因为一次可以直接合掉多个点,但是 merge 的复杂度是重复节点个数,所以需要考量)

[洛谷 P7438] 更简单的排列计数

通过 生成函数技巧缙云山车神 和一点斯特林数的知识可以干掉这道题

8.23 模拟赛

哪怕大梦一场。

被打爆了,再次正视自己的平凡,bxy 随手 209,我只有 140 左右

这场应该先把所有题都看一遍再开的,偷了个懒然后 G 了

T1 很快知道 2n 咋做但是以为 2n 没啥分(没算)需要优化于是一直想正解,无果,1h20min 抛掉

T2 看题目就知道应该比较简单,画了一个单调栈出来发现一个 i 会被很多 j < i 更新到,没有细想,感觉直接单调栈可能有点麻烦然后否了。

感到题目条件的形式非常二维数点,那么一个预处理出 l,r 表示向左向右多少依旧是最小值的位置,然后列出关系式。按理说有三个条件应该要套一个 CDQ,但是我是 sb,口胡了一下以为因为这道题里面的关系比较特殊,所以裸一个 BIT 也是可以的。然后发现这个最小值 BIT 需要支持撤回,那 G 了

花了 1h40min,剩下 1h,此时没有时间去改成 CDQ 了,可以预见到 CDQ 会非常细节,需要非常注意转移顺序

T3 基本上看完题就会了,但是没有注意到两个人是不同的,所以方案数要平方一下,GG。

T3 一共花了 40min 左右,T4 扫一眼把部分分看成了对 L 有限制,乱写了一个暴力实际上没有分,没有时间了

中午看到 result 直接 emo 了/qd

我好像太在乎结果了。

我的难度排序:T3 T2 T4 T1

下午有点困,没啥状态。

晚上更困了,T4 的双指针优化到 O(n^3) 硬是看了 1h 没有看懂,觉得 \(O(n^2)\) 枚举上下边界之后需要把被框住的点都扫一遍,然后点数是 \(O(n^4)\) 的,原来是离散化之后点数变成了 \(O(n)\),cccccc,只能说是猪脑子

大致想明白了 T4 的做法,强迫自己写了差不多 1h10min 的代码,非常困倦,非常困倦,想着如果学 OI 学成这个死狗样子不如先睡觉,倒头就睡了 20min。

依旧感到非常疲惫,感到非常心累,可能是一直在强制自己,在饮水机发呆 10min

真是令人悲哀,发呆都要计算时间了。

一回来就发现了代码一个 bug,修完之后发现写的代码啥也不是,发呆。

8.24 构造专题

虽然是构造专题,但是上午我在调昨天的题/hanx。还是那句话:

因为想得到,所以急切;正因为想得到,所以慢慢来。

调了一上午调出来了,非常高兴。

下午看了一两道构造之后又觉得很困了,晚上看了一道构造又觉得困,GG

困就困吧,锻炼一手。

构造题都比较妙,但是由于精神状态不好所以感到收获不足

8.25 刷题赛

fzoi/ruo, 搞个刷题赛结果因为使用的是 vjudge 导致评测极慢,提交之后 judging 3h 得不到一个结果我调毛线

省流助手:被 F 的 sb 构造卡了 2h,快速会 T1 但是看错了一点点题目,看错了 T2 导致送分题不会,没有细想 T3,被 J 暴打。

花了 2h 写 F。构造题好烦啊,探究了好久性质发现最后还是猜结论,nnd。中间有点烦去看了一眼 T1 然后在等 F 结果的过程中把 T1 代码也写了。然鹅 T1 读错题了,以为 nk 都会给出来,但是只给 k, n 是可以自定的,白写了一个暴力。

然而即使这样,T1 代码写完的时候 F 还没有出结果,生气了,直接上 CF 交,过了,T1 交,过了。

所以请构造题滚出 OI,我真的猜不到结论。生气了,证明了一下 F,觉得很对

T2 又读错题了,先研究了一下 CF 的交互题格式,以为没有给定树的形态,只能随机化乱搞,然后想着能不能通过巧妙的询问确定树的部分形态之类,但是询问次数限制太严格了。赛后发现给定了形态,那不是 sb 题

T3 想了一会儿不会,感觉正解的方向应该是在确立一个贪心思路之后进行 DP 之类。时间不多,没有细想,准备先把所有题看一遍,那么我们从最后一道题开始看起。

J 第一眼优化建图然后 DP,但是发现 DP 会算重;第二眼 diworth 定理转最小链覆盖,但是 n 是 1e6,又不会了。

剩下 10min,摆烂。

赛后发现 wyx 切 H,吃饭的时候听了题意然后发现实际难度是一道 普及+ 的题目,不知道为啥评成了黑,随便口胡
了一个类点分治做法,加了一点剪枝过了。

Luogu 题解区还有一种利用重剖性质:点到根路径上只有 log 条轻边,也是非常巧妙的,但是好像细节多一点

今天晚上好像精神状态不错?花了一定时间去选歌,晚上的感觉还是比较舒适的。

E 并不难,hs 稍微提点一句就知道咋做了

D 没有想到点子上,一直在想如果 A/B 很少怎么办,想的是一个接近反悔贪心的算法。但是实际上题目要求了所有的东西都要用完(所以又读错题了是吗,lj 翻译)一开始就可以直接判掉,数量不对直接不合法,那么剩下的情况实际上只要把每一个 AB/BA 都用完即可。

只需要考虑 ABABAB... 的段然后根据长度的奇偶性贪心分配即可,有一点小小的分类讨论。

8.26 构造

上午终于把昨天比赛题补完了,下午不是很想做构造,然后花了 1h 左右回顾了一下一些常见 Trick 和最近做过的题目。惊讶地发现相比于最近做过的题,时间更为久远的题目反而更有印象一点,当然可能是因为题目太难导致解法确实比较抽象。

然后下午接着看构造,跳过了 ppt 中的一些题,决定把看过 ppt 里面的构造题的解法和反思写在这里,作为一个回顾和总览

CF1375E Inversion SwapSort

naive:

早上有点神志不清,想了 1h 然后去洗了帕脸

先随便手玩了几个小数据但是没有发现什么显著的规律,考虑设 \(to[i] = pos[a[i]]\) 表示原来下标 i 最终回到下标 \(to[i]\) 之类,那么应该会连出环。注意不可能是树。

考虑能不能把多个环分开处理,发现是不行的,因为难以证明可以消去所有逆序对,何况需要保证所有原逆序对都被使用。

开始从逆序对角度思考,一种方法是保证每次消掉一个逆序对,另外一种思路是一次砍多个,但是存在使逆序对增加的操作,发生抵消。

第二种一看就很复杂,稍微想想就觉得和之前环的想法没有什么本质不同,都是想着一步到位之类。

考虑如何保证每次只消去一个逆序对,可以想到冒泡排序,但是问题在于冒泡排序不能保证交换操作是合法的。即原问题给出的实际上是一堆下标的二元组表示可以交换这两个下标上的数

一个顺畅的思考是在冒泡过程中记录一下 \(id_i\) 表示当前的 \(a_i\) 最初的下标是啥。可以保证,每次冒泡做交换的时候一定是合法的,因为冒泡排序满足交换的一定是原序列的逆序对。

冒泡排序有一个与逆序对相关的性质,提出序列中逆序数值对,那么在冒泡排序的过程中,会交换的数值对,正好就是原数组逆序数值对的集合。

然后想到这里就不会了,因为随便手模一组数据就会发现这个交换过程会发生覆盖之类,即可能本来换对了又给他换成另外一个数字等等。

sol1:

红太阳 fjy 的做法:倒叙执行上面的操作。

感性理解是为了避免覆盖,那么倒着做就没有问题,能够保证该换的都换了。

sol2: 陈刀仔 分析得非常清楚

大致意思是为了考虑到交换的合法性和每次刚好干掉一个逆序对,考虑逆排列 \(b\)

发现如果 \(u < v, b[u] > b[v]\) 那么 \(a[b[u]] < a[b[v]]\)

所以冒泡排序交换 \(b_i, b_{i + 1}\) 对应消去 a 的逆序对的过程,同时由于 b 实际上指的是下标,所以也是合法的。

交换逆排列上两个相邻位置就是在交换原排列逆序对

「GYM101611C」 Carpet

看到 20 就应该想到 log,发现和 H 很像,那么把轻儿子往上甩一行即可。

「CF1678F」Tokitsukaze and Permutations

因为做过了 [NOIP] 冒泡排序,所以这道题比较简单,

WZY PPT T1

是否存在三个长度为 𝑛 的 0~𝑛−1 的排列 𝑎,𝑏,𝑐,使得 \(𝑎_𝑖+𝑏_𝑖=𝑐_𝑖 (𝑚𝑜𝑑 𝑛)\)。如果是则给出构造。

naive:感觉好像以前见过类似的问题,好像是在学数竞的时期自己乱编了这道题?

那么就是偶数无解,奇数直接取相等。偶数发现两边加起来和在 mod 意义下不一样,奇数因为 \(2x\equiv C \pmod n\) 唯一解

至于说如何想到,那只能说觉得两个不一样的话懒得计算 10以内加减法,然后发现碰对了

WZY PPT T2

一个 2^𝑛−1 个点的完全图,你需要找出尽量多的不交的三元环。 n<=10

naive:画了画 n = 3 的情况发现好像不合法的情况应该不多。然后考虑从剩下一个四元环的不合法情况入手回推那一步出现了 lj 决策。

发现偶数肯定无解因为每一个点的度数必然保持偶数( 2^n - 1 当然是奇数)

sol:如果答案上界形式优美,那么一般都可以构造到

此处可以发现答案上界是整数,所以应该是可以构造出来的。

通过对于四元环情况的观察分析可以发现构造的重点在于避免出现一条边同时负担了多个环的“任务”的情况,即每一条边只能用一次是非常棘手的操作。

我们需要保证我们的构造方式满足:

  • 对于一个环 (x, y, z) 而言,确定了 x, y, \(z\) 的选择是唯一的

也就是要设计一个函数 \(f(x, y)\) 满足 \(f(x,y)=z, f(x, z) = y, f(y, z) = x\), 这很异或。

WZY PPT T3

一个 2𝑛 个点的完全图,你需要把这些边分成 2𝑛−1 组,每组 𝑛 条边,且每组都是一个匹配(即任意两条边没有公共点)𝑛≤1000

naive:

可以先分成两边都是 n 个点的二分图,容易发现左部点和右部点之间是容易处理的。

递归处理规模为 \(n\) 的问题,发现 \(n\) 是奇数很难做啊,n 是奇数的话那么可能存在单出来的那个点在组中实际上是和另外一部分单出来的点连边的情况,但是这个是难以区分的

sol:

考虑把 \(0\le x< y<2n -1, \ x + y \equiv i \pmod{2n - 1}\) 的分到第 i 组,把 \((k, 2n - 1)\) 扔到第 \(2k\)

因为类似 T1 的原因,注意到 2𝑛−1 是个奇数,因此对于每个 𝑖 ,存在唯一的 𝑘 使得 \(2𝑘\equiv 𝑖(mod 2𝑛−1)\)

动机:组内是匹配等价每一个点只出现在一条边中,存在了一种唯一性。假定当前分到了第 i 组,那么 \(f_i(x)\) 需要满足 \(\not\in\{f_{0\dots i - 1}(x)\}\) ,脑洞一下

做构造题需要抓住构造的难点,然后考虑形式化表达

WZY PPT T4

一个 𝑛 个点的完全图,你需要从中选出尽量多的不交的树。 𝑛≤1000

naive:

我知道要先计算上界!发现是 \(\lfloor\frac n2\rfloor\) /jk

考虑能不能直接挑出来这么多条链,手模了小数据发现可以做到但是给不出具体方案,GG

sol:

考虑增量法

需要分 n 的奇偶考虑,因为树的个数不太一样

考虑从 \(2n\to 2n + 1\), 只需要随便挑出 \(n\) 个点然后连边即可,甚至这 n 个点可以是同一个点,只要接在已有的 \(n\) 棵树上即可

考虑从 \(2n + 1\to 2n + 2\),两步走,首先考虑把这两个点添加到已有的树上,可以把 \(2n\) 个点分成两半给 \(2n + 1\)\(2n + 2\)

然后考虑多了一棵树,那么链接 \((2n + 1, 2n + 2)\), 链接 \(2n + 1/2n + 2\) 的对方部分的 \(n\) 个点

动机:增量法 nb

WZY PPT T5

平面上有 𝑛 个蓝色的点,你需要加上 𝑘 个红色的点,使得任意三个蓝点组成的三角形内部都必须至少有一个红点。注意红点必须在三角形内部,不能在边上。你需要最小化 𝑘 的大小。𝑛≤100。

—— NFLSPC #3 G

naive:

直接猜:只需要把所有最小的(没有覆盖任何其他三角形)的三角形内部放上一个点大致就可以了。

尴尬的是要输出方案,所以需要证明。乱画了一下发现需要一点技巧,确实能够选出这样数量的点,但是没有找到一个确定的构造方案。总不能枚举实数吧

sol:

上界是:2𝑛−2−凸包上的点数,其实也就是上面所猜测的那个上界

首先证明这是答案的下界。设最外层凸包点数为 𝑙_1,把这些点去掉,对于剩下的点再求一次凸包得到第二层凸包点数 𝑙_2……以此类推,我们可以把这些点划分成 k 个相互包含的凸包,点数分别为 𝑙_1,𝑙_2,⋯,𝑙_𝑘。
对于相邻两层凸包之间的部分进行三角剖分,可以得到 𝑙_𝑖+𝑙_(𝑖+1) 个三角形,最里面的凸包直接三角剖分,因此总共有 (𝑙_1+𝑙_2)+(𝑙_2+𝑙_3)+\cdots+(𝑙_(𝑘−1)+𝑙_𝑘)+(𝑙_𝑘−2)=2𝑛−2−𝑙_1 个三角形,这些三角形两两没有交,因此这是答案的下界。

现在的问题是如何构造他:

随机一个向量 𝑝,使得任意两个蓝点构成的向量不与 𝑝 平行,令 |𝑝|→ 0,同时在每个点 +𝑝 和 −𝑝 位置放两个点,可以证明这 2𝑛 个点满足要求。
这是因为把一个三角形的三个角平移到一起刚好可以覆盖 180 度,根据抽屉原理必然有一个点落在这里。
但是 2𝑛 个点多了,我们把所有在凸包外面的红点删掉(注意凸包最两侧的点可以删掉 2 个红点),因此剩余的总点数恰好为 2𝑛−2−凸包点数。

抽屉原理 /bx/bx/bx

动机:先考虑 2n,然后强大地思考出抽屉原理,然后小优化

WZY PPT T6

一个 𝑛×𝑛 的方格表,每个格子里有个字母。每次可以把某一行所有字母向右循环平移若干格,或者把某列所有字母向下循环平移若干格。若某行连续的三个字母为 k,e,y,则成为一个“键”。你需要在 10000 次操作内,最大化键的数量。𝑛≤40

—— NFLSPC #2 C

naive:蒙蔽了

sol:

贪心构造即可

考虑尽量填成 keykeykey 的样子。后续有可以仿照魔方的方式换到这里来,没有就填垃圾字符,同时如果 key 三者之中有最终剩下比较多的也可以当作是垃圾。

特殊处理 \(n \% 3\),具体有点麻烦,但是可以口胡,懒得写了。

WZY PPT T7

给定一个 1∼𝑛^2+𝑛 的排列,你需要从中选出一个长度为 2𝑛 的子序列使得子序列中第 2𝑘 和第 2𝑘−1 大的数相邻。试构造出一个子序列,或说明不可能。𝑛≤1000

naive:忘记了当时咋想的了

每次肯定是两个数一起选然后干掉了一段值域区间。希求干掉的值域区间尽量小,但是存在子序列的限制,GGG

sol:

选择 \(n\) 对数,\((n^2 + n)/ n = n + 1\),所以可以把序列分成 n 段,每段 \(n + 1\) 个数字,任务是每段选出两个数字。

继续贪心,每次想要选择的时候对后续选择的影响最小化,每次肯定选择 段中最小值和次小值,所以我们选择第二小的数字最小的段,把这段最小和次小的数字选入子序列中,并删除这一段;同时把所有其他段里小于这段第二小的数字的位置全部删掉

注意到每次只会删掉一个段,且所有其他段中数字个数至多减少 1,因此必然有解。

动机:观察 n^2 + n 是啥意思,通过分段干掉子序列限制,通过贪心构造满足相邻限制。

WZY PPT T8

有个 2𝑛×𝑚 的棋盘,有 𝑛×𝑚 个红格子和 𝑛×𝑚 个蓝格子。保证棋盘的左上角是红色,右下角是蓝色。你需要把蓝色格点中心两两连出一个向量,红色格子中心两两连出一个向量,你需要让这些向量之和为 0.

naive:

wzy 怎么不把题目讲得清楚一点啊/fn/fn

最开始以为是选边的意思,感觉比较好做,然后发现实际上是类似于竞赛图定向

然后想到说 nm 是奇数直接欧拉回路,偶数不会。

sol:

nm 是奇数的构造方式:枚举间隔长度为 \(i\),连边 \((j, j + i)\) 形成环。

nm 是偶数:注意题目保证了左上角是红色,右下角是蓝色,我们可以先把这两个格子去掉,就转化为了奇数情况;现在考虑这两个格子连出去的边怎么构造,对于网格上半部分的每个格子,考虑它和它中心对称的那个格子,若它们颜色不同,分别和左上右下连边即可抵消;若它们颜色相同,则同时向自己颜色的对角连边。

不难发现由于红蓝数量相同,因此颜色相同的红蓝对数量也相同。同色对向自己对焦连边的两个向量会形成一条整个网格的对角线,且红蓝方向相反,也可以抵消。

动机:注意到左上角是红色,右下角是蓝色的特殊性质,利用轴对称点产生抵消关系。

WZY PPT T11

T9T10 被跳过了

有 𝑛 个数字,你不知道具体的值,给定 𝑚 组提示,每组提示会告诉你 𝑢_𝑖 和 𝑣_𝑖 这两个位置上的数字较大值或较小值是多少。你需要给出一组合法的方案(给出 𝑛 个数字满足要求)。𝑛,𝑚≤10^5

哈哈,2-SAT 这个我会,求出上下界那么它只能是上界或下界。

WZY PPT T12

有一棵 𝑛+𝑚 个点的 DAG,有 𝑛 个入度为 0 的点。初始时这些点的权值分别为 𝑎_1⋯𝑎_𝑛(均为 0/1),每个其他点的权值为两个子节点权值的与非(即先取 and 再取反)但是初始权值是不定的,你可以钦定若干个叶节点的权值,需要满足:

  • 没有被钦定的叶节点全取 1 时,根节点的值和所有叶节点全取 1 时相同。
  • 没有被钦定的叶节点全取 0 时,根节点的值和所有叶节点全取 0 时相同。

你要钦定尽量多的叶节点的权值,使得它满足这个条件。并给出方案。
𝑛≤〖10〗^5

神仙题/bx/bx/bx

sol:

考虑如果能够钦定所有叶节点,那么必然是全 0 状态下根节点的值和全 1 状态相等。我们预先处理出来判断一下即可。
否则,我们考虑必然存在一个前缀 𝑖 使得把前 𝑖 个全部钦定成 1 的答案和全 1 状态相等,把前 𝑖−1 个全部钦定成 1 的答案和全 0 状态相等。二分找到一个这样的位置即可,这样我们就钦定了 𝑛−1 个叶节点,显然最多。
复杂度 𝑂(𝑛 log⁡𝑛)。

explaination:

假如把 n 个叶子钦定成这个样子:

0000000
1000000
1100000
1110000
1111000
1111100
1111110
1111111

由于全 0 和全 1 结果不同,那么中间必然存在某一个 \(i\) 使得改掉前缀 \(i\) 和改掉前缀 \(i + 1\) 结果不同

因为最好的情况是第一行和第二行结果不同,否则一直到第 n - 1 行都是第 1 行的结果,还是结果不同

假设这两行结果不同:

1110000
1111000

那么我们只需要不钦定第 4 个位置即可,此时钦定了 n - 1 个位子。

找到这样的位置可以用二分,如果 mid 和 1 结果一样那么搜索 \([mid, n]\), 虽然可能 \([1,mid]\) 里面可能也有,但是 \([mid,n]\) 里面必有。

WZY PPT T13

一个 𝑛 个点的简单无向图(无重边无自环但不一定联通),你可以询问若干次,每次询问一棵 𝑛 个点的树,交互库会返回这棵树里有多少边和无向图中的边重合。你需要还原这个无向图。𝑛≤500,𝑚≤2000,询问次数 20000。

没看懂他在干嘛。。。。。

naive:容易使用 n^2 次询问,对于每个点可以询问出它和其他点到底有没有边(利用重复的部分)。

sol:奇怪的分治,不懂、

upd 9.1 没有注意到 n^2 次询问实际上是会超询问次数限制的,G

考虑如果每次不必问全怎么做,最 naive 的做法还是 n^2 次询问。

一个分治做法是,枚举每一个点,看和 \([l,mid]\) 是否有边,\([mid,r]\) 是否有边,如果没有就不用递归了。

这样的询问次数显然是 \(O(m\log n)\) 每一条实际存在的边只会被问 log 次。时间复杂度是 \(nm\log\)

考虑需要问全,那么可以先使用 n 次询问得到 1 和其他点的连边关系,然后每次分治询问的时候借助以 1 为根的菊花图来填充剩余部分即可。

WZY PPT T14

有一个 𝑛×𝑚 的矩阵,你可以执行以下三种操作若干次,使得整个矩阵里所有元素都变成 0。

  1. 把某一行里的元素全部加上整数 k(可以为负)。
  2. 把某一列里的元素全部加上整数 k(可以为负)。
  3. 把某一主对角线里的元素全部加上整数 k(可以为负)。
    主对角线指行编号和列编号之差为定值的一些格子。
    你可以执行这些操作总共不超过 6000 次或者报告无解。2≤𝑛,𝑚≤1000

套路题,但是还是很妙,关键思想是抓住不变的量。

事实上只需要把前两行和前两列变成 0 即可,如果此时还不能把整个矩阵归零那么必然无解。
证明就考虑任意一个 3×3 的矩阵,𝑎_11−𝑎_12−𝑎_21+𝑎_23+𝑎_32−𝑎_33 的值在这些操作下永远不变。
于是这样的构造是很容易的,前两行从右到左先操作列再操作对角线,然后前两列从上到下先操作行再操作对角线即可。4000 次操作就足够了。

[CF1375H]Set Merging

naive: 线段树乱杀,感觉复杂度就很对。

sol1: 线段树复杂度确实很对

sol2:值域分块然后套用类似猫树的处理方法

没有时间写代码了。

upd 8.28 写了

8.27 模拟赛 + ABC

胜负欲是双刃剑,也许不知不觉中就已经成为恶龙。

I'm lucky.

之前一段时间胜负欲一直成为了动力之一,每天都在精打细算,觉得很累甚至有点偏激,压力较大。然后就以为自己的道路是如此的坎坷。

看了几篇 NOI AG 游记,发现大家都是真心学 OI 的,我的同道人很多。

可是这个时候又产生了新的焦虑,天赋没有别人强,怎么卷得过呢?隐隐有点嫉妒的色彩

但是按理说,如果达到了“真知”,那么自然会明白人生是一场旅途,每个人有每个人的欢喜,又怎么会焦虑?

原来现实是僧多肉少,好的资源都想要,而同时人的精力也是有限的。

所以学习 OI 就必须舍弃一些东西,靠近这样美好的事物自然是有对应的风险和代价。

这个现实是需要接受的,也可以如同胜负欲一样转化成动力的一部分,但是并不意味着要欣然应允这样的现实,但这个也许是这个社会共同的任务了。

每个人有每个人的局限性,他的任务就是打破这样的局限性。

努力便是我的天赋。

唯有那份炫目,未曾忘却。

考场简记 TXT: 《T1 冲冲冲》

8:50 开冲 T1

限制:

  • 每个颜色有且仅有一条弧
  • 弧两端同色
  • 弧不交

性质:

  • 每个颜色 3 种弧,其并集为全集,交集可以视作空
  • 每个弧至少覆盖两个点,期望三个点。剩下 n 个可分配位置 \to 分治做法?

暴力:枚举

sol1: 容斥相交边数量。md 又是这种独立集方案数,G。

known: 双指针求 deadline

sol2:容斥颜色。效果不大。

sol3:利用“性质”:dp[l][r][i] 区间选了 i 种颜色。

dp[l][r][i] = \sum_{L,R} \sum_j dp[l,L-1,j]dp[R+1,r,i-1-j]

优化方向:

  • 减少状态数量:
    • [l,r] 可配对数量上界剪枝。数量可以通过二维 BIT 计算,即二维数点。
    • 尝试经典柠檬优化:但是有意义的 dp[l,r] 啥也没保证
  • 贪心决策优化分配点数/优化区间选择:又不是取 max/min,贪心尼玛。
  • 卷积: FFT 之后独立 FFT[l,r,i]=\sum_{L,R} FFT[l,L-1,i-1]FFT[R+1,r,i-1]
    FFT 复杂度 = n^2 nlogn
  • 快速找区间 [l,r] 内可配对的区间:/ng
    • 刷表:一个 L 唯一对应一个 R,FFT[l,r,i] 刷给 FFT[l,x..n,i+1],FFT[1..x,r,i+1] 连续区间。假装 n^3,问题在于 DP 转移顺序 \to 按照长度转移 DP 问题不大,刚好保证只刷一次。\to 小心长度相等的情况需要去掉 /ng。
  • 交换枚举顺序:好像区间 [l,r] 确实不能够再拆分了
  • 利用“性质”:性质已经用满了?
  • 寻找组合意义:有个 GB 组合意义。
  • 底层状态数:3n 实际总状态数:??(考虑性质2,状态数不会太多)

当前瓶颈在于 FFT 降不了。总复杂度 O(n^3logn+有效状态数量),可以通过 Subtask2

但是不用每次都做 IFFT,所以实际上只需要在底层状态做成 FFT,然后最后求答案的时候上一个 IFFT 即可。

复杂度 n^2logn + 有效状态,可以通过 subtask3

考虑平衡状态数和转移。

区间 DP 如何换状态呢?考虑倍增?

dp[l,l+2^k,i] = \sum_{L,R} \sum ask(l,L-1,i-1)ask(R+1,r,i-1)

而后刷表的操作变得困难起来,同时初始化问题如何解决?

c,md,突然发现之前的做法假了,之前刷表不是 O(1) ,刷的是一段区间不是两个单点,考虑前缀和优化,但是右端点一直在变化,导致乘上的系数也在变化,G

// 好像曾经研究过这样类似的问题怎么做前缀和优化

但是好像配合一个线段树也是可以做到 log?小心空间问题。

假装复杂度变成 n^2logn+有效状态*logn,假装能过 subtask3,但是显然不能写。

10:50 放弃思考 T1,刚好 2h /cy

11:15 T23 有点自闭,回到 T1

sol4:LGV 但是感觉不太行。

然后滚回 T23

11:40 放弃思考

感觉这种列出所有想法的方式是非常有用的,其实感觉今天的 T1 是有希望解出的,因为现在回想起来实际上在最开始的时候就联想到了 [AGC020F] Arcs on a Circle 里面先贪心确定一条边的思想。

但是由于最开始的时候脑子里面砰砰砰往外面蹦解法蹦性质然后想着这个要有贪心前提似乎自动把他否掉了。

还有一个小问题是“考虑组合意义”并没有用心考虑,可能是当时猪脑已经过载了,不然也可以通向正解。

思考体验总体来说还是不错的。

yr 切 T1 /bx/bx/bx

中午睡觉时间不够导致下午最开始的时候比较困倦,洗了帕脸就又行了/tiao

———————

这把 ABC 亏炸了啊
C 题简单计算几何卡了 30min 发现是 < 写成了 <= 。
然后心态就开始出问题了,E 最开始读错题了,F 直接神志不清。
G 题一眼二项式定理但是不会算 k 个 RG 的方案数。
最后看了一眼 EX 发现是裸的 CDQ /ll
我果然是采购

失败了,但是会赢。

8.29 NOID2原题模拟

提前半个小时起床有点伤,整场都有睡意,中途去洗脸但是没有用/lh

T1 考场上实际上已经想到正解了。

一眼糊了一个树 hash,发现可以匹配的子树可以贪心去掉,然后觉得这个复杂度非常可以接受。(就是正解)

由于脑子不好,最开始以为要外层 solve(u,v), 中层 dfs 枚举排列,内层 dfs 分配操作次数。写了半天发现由于内层 dfs 需要调用外层,会导致 中层和内层的 vis 数组被修改。

然后把内层的问题修好了,但是忘记了修中层,神奇地过了下发的前两个样例。(状态实在有点差)

突然想起来中层没有修,觉得很麻烦,然后推敲了一下 next_permutation 的拼写,猜测了一下它的用法,还是
没过第三个样例。

生气了,把最开始那个贪心去掉了,发现过了,以为这样贪心是不对的,但是想了想有没有什么问题,不管了,有暴力分就行。

但是第四个过不了,大概是爆栈了,内层 dfs 传入了太多参数。

发现显然不需要分配,因为输入保证了 \(n <= m + k\),所以不存在分配。

这种好事,删掉内层 dfs 之后稍微调了一小下发现发下来的样例全过了。

简单计算了一下复杂度,发现有点难过,回头看那个贪心,还是觉得那个贪心很对,但是不知道为什么加上就是要错,时间已经不是非常充裕了,进入 T2。,

但是实际上贪心的思路没有问题,我不会写双指针我是天使。

最后发现 T1 居然有 WA 的点,发现是后面疯狂剪枝的时候剪错了,比较 dep 应该是 mxdep 而不是当前点的 dep。挂了 20 分。

所以 T1 实际上难度应该在提高减。

T2 涉及到冒泡排序,感官上比较吓人。

容易发现每个点的取值只会有 \(O(m)\) 种,这样肯定是不劣的,所以有 \(O(m^n)\) 的做法。

然后性质 A 显然有 \(O(n^3)\) 但是斜挂,性质 B 感觉两个关键点之间的数只会取两个关键点之一,这样应该是不劣的,感觉上 DS 就好,但是性质 A 的 \(O(n^3)\) 把我难住了,导致没有时间写性质 B。

如果都写出来应该是有 60 分。

T3 没看,因为之前看过了一些巨佬的游记都说写 T3 很亏。

省流助手:T1 亏炸导致 T23 没有时间。

后面想了想 T2 的性质 B,发现上面的贪心有点问题。

感觉每次面对这种需要贪心的题目就会比较虚,总感觉贪心的基础不稳或者说把贪心思路搞错了导致后续的很多推导建立在一个错误的基础上,从而导致整场考试 G 掉。

一方面,如果永远没有这份敢于试错的勇气,那么永远都没有思考后续部分的机会;
另一方面,请以单纯的解题的心态去面对每一道题,砍掉那些丑陋肮脏的胡思乱想和预设。

深深地明白自己的弱小,但这正是我的道路。

NOI2022 D2T2

非常 nb 的贪心题!

容易预处理出每个位置的下界,同时可以判断无解。还需要处理的是每一个区间恰好有最小值这个限制,一个简单的想法是给每一个区间都固定一个数(当然可能多个区间公用一个数字),然后剩下的再说。

一个贪心结论是:把区间按照 l 从大到小排序之后,如果区间内已经被固定过 vi,那么跳过,否则固定区间第一个下界为 vi 的位置。

首先这样固定肯定是不劣的,因为每个区间始终要固定一个数字,而我们冒泡排序希望较小的数字尽量靠前。

其次,排序的目的是固定更少的数字。

这可以 ST 表之后二分实现。

考虑剩下没有确定的位置怎么办,贪心的想法是从后往前做,每次都选择当前新产生逆序对最小的值。

感性理解是某一步如果不这样取那么会产生其他的逆序对,需要打 combo,是很难的,所以不劣

理性证明:

考虑当前通过上述策略处理了点 x 和 \(y>x\), 不妨设 \(v[x]>v[y]\), \(v[x]<v[y]\) 可以同理证明。

考虑为什么 y 不能上移到 \(v[x]\),那必然是存在某一段固定的 \([l,r], l>y,y<v[l,r]<x\) 阻止。

考虑为什么 x 不能下移到 \(v[y]\),那必然是存在某一段固定的 \([L,R],R<x,v[l,r]<v[L,R]<x\) 阻止

既然可以阻止,那么满足 \(R-L+1 > l-r+1\),所以下移到 y 显然不优。

具体实现可以用一棵值域线段树维护位置 i 取某个值的新逆序对个数。最开始表示第一个没有固定的点,随着下标的移动对线段树做区间加减即可。

DS 人狂喜

8.30 NOIP 模拟赛

今天上午精神要好一点,在 9:40 左右感到自己清醒了。

T1 一眼秒了,min-max 板子没啥好说的。然后去上了个厕所。

回来看 T2,手推了一会儿并没有发现什么有用的性质,说待会儿打完暴力找规律。

T3 看不懂题意,GG,按照自己的理解写了一个发现不对。我的理解是 求 每一个敲核桃的策略 在每种核桃排列所耗时间的最大值 的最小值。即是要选择一个聪明的策略处理一次摆在面前的核桃。写了一个发现策略非常优秀比答案小。

实际题意略,我感觉这个应该是题面的锅,样例给的太水了,大样例又太大。

T4 第一眼没看出来可以线段树,只感觉暴力很好写。

好!由于在 T3 上尝试了很久,所以现在的时间是 9:30,两分钟解决 T1,进入 T2

发现了一个奇特的性质是存在无伤点,即不会被任何人打到,然后这些点有些奇特的关系。长成 1 1 3 1 3 5 7 1 3 5 7 9 11 13 15...

思考了一下这样的原因但是并不知道。

回头扫一眼草稿纸,注意到了曾经写下的:只会做 log 轮,简单思考之后发现可以直接模拟。调了一段时间。

那么我们再入 T3,还是没懂/jk

那么我们写 T4 暴力,写的途中发现正解就是树剖线段树。然后发现一段 -1 的方案数不会算/qd,亏炸了。

————————

明白 T3 题意了!但是只会斜率优化 DP,正解是一个结论,很妙,性质挖掘带师可以想到 / 打表观察。

T4 正解比我想的难写多多多多多了,所以实际上不是很亏?

下午很困,可能是中午打乒乓球非常集中然后灵感爆发手感炸裂,导致下午没有精神。

晚上浅睡了一会儿,开冲 T4。我果然是阅读理解大师(orzstd

T4 巨大难细节题,人冲傻了。

upd 8.31 调出来了,阶乘需要预处理到 1e6 + 1e5,因为是 C(n+m,n)

8.31

终于把昨天 T4 调出来了。

上午写了 NOI2022D1T1,帮 zqm 调了一点 T4,正在思考 CF702F

下午有点困,和 yr 讨论了一下昨天 NOIPT3 的证明,发现我的证明是错的。

复习了 FHQ Treap 然后被 CF702F 疯狂卡常,生气了,直接重构。

重构一遍,他很给面子,过了。

晚上比较有精神,但是感觉不是非常集中?

糊完 T2 之后,和 zqm 一起尝试证明 T4 的时间复杂度,坚信应该是单 Log,对吉司机线段树有了更深刻的理解。

UOJ 群正好在讨论 FHQ 的时间复杂度,有趣。

CF702F T-Shirts

naive:

最开始没有读懂题面闹了笑话/qd

首先显然可以对每一个询问枚举一遍,然后自然想到能不能多个询问合在一起做。

那么需要支持每次对 >= c 的东西 -c, 感觉这个东西有点 YNOI 的味道,然后看到了每个数只会跌落 log 次的结论。

感觉这样应该是可以做的,但是代码复杂度有亿点高(当时那道题就没有调出来)。

sol:

平衡树维护这个东西即可。使用 FHQ,对于 \(<c\) 的部分不用管;\(<=c<2c\) 的部分暴力合并,因为相对大小不变;剩下的打标记。

由于上面提到的那个结论,即类似势能分析,所以这样的复杂度是对的。

然后被卡常了, FHQ 的实现需要一点卡常技巧,主旨是避免无意义的 pushdown 和减少传参。

另外有一种非常有趣的 写法,大意是暴力维护一些四元组 \((l, r, v, a)\) 表示区间 \([l,r]\) 的 tag。顺次做每一个物品,如果出现了一个区间 tag 不统一那么拆成两个。如果区间个数过多那么全部 pushdown 重构。

这样的复杂度是啥呢,不会分析,依然是考虑上面的结论,每次重构相当于把新增的区间中的一个前缀的数的值砍半,感性一下,试一试重构的闸值,大概就是对的 /lh

Csacademy and or max

naive:

想到正解了,但是不会证明复杂度。

and or 相当于把一段区间的某些二进制位搞成相同的,很烦,可以想到打上 tag 转化成激加法。类比 CF1515H Phoenix and Bits ,复杂度的关键应该在于如何快速判断某一个区间是否有往下递归的必要,然后想歪了。

sol:

肯定无论如何都有递归的必要的啊。。。只需要得到区间是否相同,相同值是啥即可。

定义一个节点的势能是这个区间里所有数,每一个二进制位如果不全相同(O/1) 势能增加 1 (每一个节点势能最多 log)

那么最开始有 n 个数,每一个数 log 势能。

每一次打 tag 会找到 log 个对应的区间,势能会增加的是在找区间过程中 \([L,R]\)\([l,r]\) 有交但是不包含的节点,每个这样的点会增加 logV 的势能。

考虑每次递归肯定让势能至少减少 1,所以复杂度是 \(\mathcal{O}(N log A+ Q log N log V)\)

posted @ 2022-09-01 08:32  _Famiglistimo  阅读(139)  评论(0编辑  收藏  举报