Sightseeing Plan

有趣题。 首先答案相当于要求三个矩阵里枚举三个点,然后求 AB 的路径数乘上 BC 之间的路径数加起来。 然后这个东西呢,我们先考虑假如 A 和 B 都固定的情况,我们发现是一个矩形。 然后我们根据一个叫曲棍球棒恒等式的东西我们很容易写出其为: $$ f(x_r + 1, y_r + 1) + f(x_l, y_l) - f(x_r + 1, y_l) - f(x_l, y_r + 1); $$ 然后我们就有平方做法了。 然后我们怎么继续优化? 我们首先发现这个式子是可以拆的,拆成十六个问题,每个问题相当于给起点和终点要求午饭点。 然后我们还是想着差分对吧,然后我们就把他差分成:午饭区域是一个以起点为左下角的长方形。 然后我们惊奇的发现我们可以枚举我们从哪个边界出这个矩形的,因为我们知道了这个之后我们可以方便算出有多少种方案,更重要的是——在经过固定边界的一条路径上的午饭点的数量是相同的,我们直接乘起来就可以了。 然后就大概是超大常数 $O(n)$。

June 4, 2026 · 1 min · Inftress

Random Kth Max

简单题。 首先看到这个题目第一眼就要想到结论:$n$ 个在 $[0,1]$ 间均匀随机的数的第 $k$ 小期望是 $\cfrac{k}{n + 1}$。 这个范围相当宽裕,我们只要给出一个 $O(\text{poly } n)$ 的即可 然后我们考虑枚举答案所在区间,我们现在枚举到了 $[t - 1, t]$。 然后我们想知道有多少个随机数落在这个区间里,多少个落在区间左,多少个落在区间右。我们如果知道这些我们可以直接通过那个结论算出对应的期望。 然后我们就是想要知道在钦定了左中右的数量后有多大概率。 我们可以使用二维背包,直接做即可。时间复杂度四次方。

June 4, 2026 · 1 min · Inftress

彩绘

简单题,但脑抽了。 这个题目本质上就是让我们算这个每个位置的系数。(因为他可以通过类似哈希来检验你的系数,就算你有不算出系数的方法,那通过他的不同数据一定能唯一确定系数) 好的我们很容易得到一个 $O(n^3)$ 的做法,设 $f_{i,j}$ 为第 $i$ 轮第 $j$ 个数的系数,然后枚举你当前选择哪一个。然后便是 $O(n^2)$ 的。你发现对每个 $f_{i,j}$ 他只从 $f_{i-1,j}$ 和 $f_{i-1,j-1}$ 转移过来。然后就方了。 如何继续优化?显然你可以把每轮的除以 $i-1$ 和除以 $2$ 拎出来。然后你对着剩下的表进行干瞪。你通过瞎试发现他一定是 $\binom{i-1}{j-1}$ 的倍数。然后你对他除完之后的进行因式分解。然后发现除完之后是两个双阶乘的积。然后你就糊里糊涂地做完了,但并不知道这个组合意义。这不乏为一种方法但多少有点唐了。 然后说正解,实际上你发现我糖丸了。你还可以继续拎。具体思想就还是考虑不变量以及图论建模。我们把他变成在自动机上走,然后你发现你每增加 $j$ 就会乘上固定贡献,每增加 $i-j$ 也会乘上固定贡献。于是我们发现这两个贡献与你走的路径无关,乘上的东西都是一定的。然后贡献就是两个双阶乘,而你的路径数就是 $\binom{i-1}{j-1}$。

May 30, 2026 · 1 min · Inftress

Sequence Growing Hard

这是一个“分步”进行构造的过程,每一步关联不大。所以我们先研究每一步有什么性质。 假设你现在有长度为 $n$ 的序列,你需要在第 $i$ 个元素之后插入一个 $x$,字典序变大当且仅当? 你考查你插入后的序列,找到那个你插入的元素。其后面第一个第一个与前一个数字不同的数字比他前面的数字大,或者其后面的所有数字相等。 好吧我错了。 考虑加元素是困难的,考虑删元素。 然后你发现对于一个连续段来讲你删任意一个都是等价的,所以我们钦定每次删最右边那个。 这相当于每次删 $a_i > a_{i+1}$ 的地方。这看起来容易多了。 我错了,我好菜。 我们设 $f_{i,j}$ 为考虑长度为 $i$,值域为 $k$ 的。 我一直在试图一个一个加,结果发现还是做不了。 主要是你发现这个东西你还是要知道全局信息。 题解说:我们分治! 然后你直接枚举 $1$ 的出现位置和出现时间,然后分成前后两半。 做完了。 为什么我这么蠢啊。

May 23, 2026 · 1 min · Inftress

Two Characters, Two Colors

首先把如果 $b > r$ 那肯定选蓝,一定不劣。 然后我们就再把 $r-=b$ 然后就变成了你选一个子序列使得 $\sum r - 逆序对数$ 最大。 然后我们显然 DP 记录前面用了多少个 $0$。 $f_{i,j}$ 表示当前考虑了 $[1,i]$ 的下标,前面用了 $j$ 个 $1$。 然后转移显然好转移,考虑优化。

May 23, 2026 · 1 min · Inftress

Permutation and Minimum

首先我们发现其实这个东西是可以分类讨论的。 对于 $(2i-1,2i)$ 这样的二元组讨论。 若两者都不是 $-1$ 则直接跳过。(甚至可以直接离散化掉) 若两者都是 $-1$ 则可以放在一起算。具体来讲,我们可以数一共有多少个这样的二元组,然后我们只要算全是 $-1$ 的答案,然后再乘上把这些二元组去掉之后的答案即可。(因为对于其他的二元组确定的情况下,实际上的方案数总是相同的) 比如有 $k$ 个二元组,然后你考虑钦定哪些数作为二元组中的更小值,然后再排列一下。钦定的方案数为 $Catalan(k)$。因为注意到你本质上要求对于任意前缀,选的作为最小值的个数 $\ge$ 作为最大值的个数。然后排列即为 $k!$,即答案为 $Catalan(k)k!$。 现在我们只要专心考虑恰好有一个 $-1$ 的即可。 我们先考虑简单的情况,假设整个排列都是一个 $-1$ 和一个非 $-1$。 然后这个时候开始 DP。 我们发现这个顺序根本不重要,我们只要给他们染色然后配对即可。最终再乘上阶乘。 我们如法炮制,还是按值域排在一起,发现我们可以从大到小做。 我们称已经被填入的为白点,我们要填的是黑点。 设 $f_{i,j,k}$ 为当前处理了值域在 $[i,n]$ 内的东西,其中钦定 $j$ 个 $[1,i)$ 中的黑点,$k$ 个 $[i,n]$ 内的黑点已经被预留了。 然后直接转移即可。 调半天过不了样例。 问题在于,实际上你不能在 dp 的时候简单地只看你留了几个来考虑这个 $(-1,-1)$ 二元组,你要把他放进去算,因为实际上这个预留与实际上还是有一些区别的,因为你可能可以填上这个东西。

May 21, 2026 · 1 min · Inftress

论思考

如何思考?在如今这个阶段没有良好的思维习惯恐怕是举步维艰。 使用记录工具,例如在电脑上进行 markdown 打字。这样应该可以显著提升思维的深度。 别躺床上想题!这样很容易变懒散。不想动。 排除干扰,尤其忌讳思考一半打断,这会消除思考的惯性。使你注意力涣散。 思考的时候要试着去从本质上,从抽象上看问题,越本质越好。这样能排除 corner case 的影响,使整个问题变得形式简洁,容易被一次性处理。 主动出击而非守株待兔。 主动打表 主动猜结论 主动尝试方向 主动手玩样例 在记录了目前思路之后如果没有头绪。不妨回头看你想到的思路,试着想想如果反过来会怎么样,推敲每一步是否有其他道路。这可能会发现你一些错误的惯性所带来的疏忽。 放平心态,心如止水。不要急。就算快想出来了也要严格验证。不然容易最后临门一脚踢歪了。 思考时应该要试图在不同事物间建立联系。把他们连成一个整体。 善用潜意识,想不出来可以先换题,过会儿再想。 有危机感!不要懒散。 要坚信这个题目是想的出来的。 当你发现你走的很深的时候立马掉头。不能一条路走到黑。

May 21, 2026 · 1 min · Inftress

AtCoder Quality Problem

我意识到了我做 DP 的严重问题。我非常习惯于说去推结论和性质,结果迟迟没有开始试图设计状态。对 DP 理解的非常的不深刻。在推性质的时候应该主动像 DP 上靠。而不是先推再说。要主动地设计状态,尝试几种经典的状态设计。然后试图找出关系。或者是先找出子结构之间的联系。 DP 的本质就是子结构。要主动洞察这个题目有哪些子结构,以及他们之间的良好性质,而不是仅靠“发现”。 我觉得我设计暴力 DP 这件事比 DP 优化更困难。因为我并没有养成这种良好的思维习惯。 开始正题。 这个题目首先就是我们 feel 一下这个题目。 一个 native 的想法是考虑从小到大以 popcnt 为层推进。然后呢你其实可以把他看成一个金字塔。然后你想一下,比如说你当前先把单个元素染个色。然后对于横跨的,怎么办?实际上对于这些横跨的不能随便染色,反例:RBBR 13 24 R 14 23 B 然后就炸了。 然后呢我就摆了,也许是畏惧吧。 你其实可以推进一步,你思考为什么会炸。 因为 R 和 B 的并都是 S。 然后显然 R 和 B 的并不能都不是 S。 然后如果 S 是 R 那一定是 R 的并是 S。反过来同理。 实际上现在你可以直接开始试图设计状态了。 比如你很经典地你设 $f_{S,0/1}$ 为 $S$ 内染色,然后颜色为 $0/1$。然后这个时候你想怎么转移。 你发现你好转移啊,你找这个并不是当前颜色的并。然后你发现其实这个并一定得是对应的 $f$ 然后你直接转移即可。 优化用脚优化。你直接一个一个加即可,套路。

May 21, 2026 · 1 min · Inftress

The Third Grace

观察 1: 这个区间其实跟左端点的关系不大,跟右端点关系更大。 于是我们可以想到从左到右考虑,于是乎我们发现了一个 $O(n^2)$ 的做法。 我们设我们当前决策了是否要激活 $[1,i]$ 且激活了 $i$ 的最大代价为 $f_i$。 然后转移就是枚举 $j < i$,然后减去多于代价,加上新的。 我们考虑优化他。 首先新的贡献是跟 $j$ 无关的。 然后剩下的呢,我们考虑我们往右扫。维护右端点在 $i$ 右边的区间。然后你把他们的左端点放在线段树里,你每删除一个线段,就在对应的区间内将线段树减一。然后相当于要区间 $y_i$ 加,区间 $x_iy_i$ 最小值。然后你发现这是 KTT 板子。 做完了。

May 20, 2026 · 1 min · Inftress

Yearning for Yonder 2

自己想出来了。 他这个 $p_1$ 和 $p_n$ 的限制本质上是因为一个排列和其颠倒过来的是不可区分的,因此我们只要最后判一下即可,之前完全不需要考虑这个条件。 首先他既然说 randomness 那我们就 random。 然后我们看到 $\mod 3$ 我们应该要向同余类的方向想。 然后我们如何获得同余类?这个是好做的,对于每个点,随机取一个点,query 一下,选到同余类的点的概率为 $\cfrac{1}{3}$,因此我们期望 $3n$ 次获得同余类。 然而我们并不知道同余类哪个是 $0,1,2$ 然而其实我们只要知道循环的方向即可。然后我们发现循环的方向都不需要知道,因为循环方向变了就是排列翻转了,我们随便指定一个方向。 然后我们发现我们已经可以比较大小了,如果 $x,y$ 不在一个同余类里,则可以比较但同余类内部无法比较。 我们相当于要做这个排序。而排序本质上是用子结构堆起来。(不管是什么排序) 然而我们发现如果在当前子结构中有两个相同同余类的点对其他所有的结果都相同我们根本没法区分。 但其实我们根本不用区分,我们把这些东西打包起来,要用的时候拿我们当前的值对这些东西依次问一遍。 然后我们感觉一下我们发现这个期望并不会增加多少的询问次数。因为一个很大的连续同同余类的段的出现概率指数下降。 然后我们其中一个想法是使用插入排序,每次二分大概位置,然后暴力扫描,使用平衡树即可,但实现难度有点高。 另一个想法是,我们使用归并排序。我们每次在归并的时候,如果遇到大包就把他们两两问一遍,这个明显容易的多。

May 18, 2026 · 1 min · Inftress