2026 晚练记录

注意

  • 数组不要开小了(1.20)

  • 剪枝不要剪错了(1.25)

  • continue 和 break 不要写混了(2.26)

  • 写区间操作时一定要判 l>r(3.26)

  • 注意 long long(4.14)

  • st 表查询可以 $O(1)$(4.14)

  • 用 STL 弹出时一定要判空(4.15)

  • 猜性质时一定要手模样例(4.16)

  • 分块处理是注意不要把块的编号与端点编号弄混了(4.22)

  • 认真读题(4.27、6.22、7.8)

  • 枚举时大小上界/下界不要写错(5.7)

  • 该卡常时记得开 int(5.11)

  • 多测时记得初始化/清空(5.25、9.1)

  • 排序不要排反了(6.11)

  • 概率不要除错了(6.15)

  • 不要乱特判(6.22、6.28)

January

Week 4

Tuesday(1.20)

P3092 [USACO13NOV] No Change G

水题(但我为什么数组开小了呢)。

不难发现,$k$ 的值很小,我们可以考虑状态压缩。

令 $f_i$ 表示我状态为$i$ 时我能走到的最大距离,最后用二分和前缀和优化即可。

Wednesday(1.21)

P5664 [CSP-S 2019] Emiya 家今天的饭

很好的题,我们可以考虑正难则反,发现如果没有第三个约束条件,那么答案就是 $\prod _{i=1} ^{n} (num_i+1)-1$,其中 $num_i$ 就是第 $i$ 排的和。

我们来考虑什么时候不合法。

不难发现,如果一个方案不合法只会有一个主要食材的数量越界了,不需要考虑其他的容斥。

由此,我们可以枚举越界的数 $col$ 并设计出状态:$f_{i,j}$ 表示对于前 $i$ 行,$col$ 中选的数量比其他数多 $j$ 的方案数。

转移也很好想:

$$
f_{i,j}=f_{i-1,j}+f_{i-1,j-1}a_{i,col}+f_{i-1,j+1}(num_i-a_{i,col})
$$

最后用方案数减去每一次枚举的 $col$ 所对应的 $\sum {i=n+1} ^{2 \times n} f$ 即可。

注:这里是 $n+1$ 到 $2 \times n$ 的原因是在转移中有可能出现 $j$ 为负数的情况,需要加个偏移量。

Thursday(1.22)

P3953 [NOIP 2017 提高组] 逛公园

我为什么会在一个数组上犯唐。

难得的图论题,但还是有 DP 的成分。

我们发现,所有的统计都是基于最短路的,所以可以先把每个点的最短路求出来。

我们可以考虑记 $f_{i,j}$ 表示对于第 $i$ 个点,有多少种方案可以使路径长度为 $dis_i+j$,其中 $dis_i$ 表示从 1 到 $i$ 的最短路径。

因为不是所有点都需要转移,我们可以考虑建反图,倒序处理,这里就是记忆化搜索了。

Sunday(1.25)

P3119 [USACO15JAN] Grass Cownoisseur G

为何 28pts?

哦,剪枝剪错了。

我们发现数据存在 SCC,那直接一波缩点。

我们又可以发现答案是一个满足以下条件的链:

  • 链中包含 $1$ 号点所在的 SCC
  • 链的始端有一条存在连向末端的边

而答案就是这条链的长度。

Week 5

Monday(1.26)

P2491 [SDOI2011] 消防

为何 MLE?dfs(vl,fa)

我要和这世界爆了!!!

你问我为什么不想二分?因为不会写 check。

思路很简单,我们发现答案的端点所在的区域只可能在树的直径上,那我们可以考虑求出直径上的所有点,并求出这个点的子树内所对应的最大与次大深度,最后用单调队列维护区间最大值即可。

哦,我太 TM 唐了。

Tuesday(1.27)

P1941 [NOIP 2014 提高组] 飞扬的小鸟

哦,我觉得这玩意儿应该叫挂分日志。

开局把题看错了,写了 30min 才反应过来,后来才知道原来界面最右边不是第 $n$ 列。

定义 $f_{i,j,0/1}$ 对于第 $i$ 列,要求到达 $j$ 高度的最小操作次数。

转移:

$$
f_{i,j,1}= \min \ (f_{i-1,j-x_{i-1},l}+1,f_{i-1,j-x_{i-1},0}+1,f_{i,j-x_{i-1},1}+1)
$$

$$
f_{i,j,0}= \min \ (f_{i-1,j+y_{i-1},1},f_{i-1,j+y_{i-1},0})
$$

当 $j=m$ 时我们还可以:

$$
f_{i,m,1} = \min ^m {m-x{i-1}} \ (f_{i-1,j,1}+1,f_{i-1,j,0}+1,f_{i,j,1}+1);
$$

特殊处理一下这一列上有水管的情况即可。

真 TM 想死。

February

Week 4

Wednesday(2.25)

P1772 [ZJOI2006] 物流运输

难得的场切。

  • 赛时做法:

发现港口数量很少,可以考虑状压,定义 $f_{i,j}$ 表示第 $i$ 天只通过 $j$ 中的点所需的最小成本。

令 $bis_{i,j}$ 表示第 $i$ 天中除去 $f_{i,j}$ 外的最小成本,$dis_{j}$ 表示嵌定只通过 $j$ 中的点所需的最小成本,那转移很好想了:

$$
f_{i,j}= \min (f_{i-1,j},bis_{i-1,j}+k)+dis_j
$$

我们发现 $dis$ 数组可以预处理,$f$ 和 $bis$ 数组可以滚掉第一维,所以复杂度为 $O(2^m e \log m + n 2^m)$,可以考虑用 SPFA 再加点卡常通过。

  • WWX 提供的解法:

发现对于每个位置 $i$ 可以考虑枚举上一个和它路径不同的点,然后计算 $f_i$ 从哪转移即可,复杂度:$O(n^2 m \log n)$。

Tuesday(2.26)

P2254 [NOI2005] 瑰丽华尔兹

再次痛失 100pts。

为什么把 continue 写成了 break 呢?

思路很简单,可以考虑定义 $f_{t,i,j}$ 对于第 $t$ 号区间,要求最后会出现在 $i$ 行 $j$ 列的位置上。

发现转移需要知道上一个点的位置,这会在时间上出现一个 $T_t - S_t + 1$ 的复杂度,由此可以考虑用单调队列优化掉。

代码分情况讨论即可。

March

Week 1

Monday(3.2)

P9921 [POI 2023/2024 R1] Budowa lotniska

笑点解析:钦定了 $i$ 行都是横着的,但还需避开 $j$ 列。

首先处理出两个都为行和列的情况,然后考虑钦定一行选第一个,在取一列作为第二个。

至于重复的情况可以选择分别令 $a_{i,j}$ 是在第 $i$ 行和第 $j$ 列即可。

Tuesday(3.3)

P9923 [POI 2023/2024 R1] Przyciski

赛时题目看错了,只来得及打上暴力,但暴力也挂了。

我们发现题目中会存在两个不同的修改,一种思路是 DP(事实上,赛时就是这样想的),另一种是考虑建图。

我们可以考虑根据按钮所在位置 $x_i$ 和 $y_i$ 分别建图,随后可以考虑通过分类讨论来解决问题。

分奇偶性来讨论:

  • 对于偶数情况,发现只需图中有环即可。这个正确性是显然的,每一个点会有两个度,即会被修改两次,这就是偶数情况。
  • 对于奇数情况,我们发现图中是不存在环的,这会形成一片森林,我们发现对于叶子节点,它与它父亲的边是必选的,而对于其余点,只需考虑有多少边连向了它,以及是否向它的父亲连边即可。需要特殊判断一下根节点。

Wednesday(3.4)

P7961 [NOIP2021] 数列

赛时发现 $S$ 过大,不好判断,没考虑按位处理。

我们考虑定义 $f_{i,j,l,x}$ 表示当前处理好了 $S$ 的第 $i$ 位,此时向第 $i+1$ 位进位了 $j$ 并且前面有 $l$ 个 $1$ 以及确定了 $x$ 个 $a$。

这是一个我为人人的转移,我们发现对于 $f_{i,j,l,x}$ 我们来枚举下一个位置用 $y$ 个 $a$ 它可以转移到的位置其实就是 $f_{i+1,(j+y) \div 2,l+(j+y) \bmod 2,x+y}$ 但是 $a$ 是无序的,所以需要转移中要乘上 $\binom {n-x}{y} \times {v_{i+1}}^y$。

令最后一遍转移的位置是 $pos$,则答案就是:

$$
\sum {i=0} ^{k} f
$$

Thursday(3.6)

P2668 [NOIP 2015 提高组] 斗地主

又是一道大模拟。

我们可以考虑记录每种牌共有多少个,再考虑把它压缩成五进制数,用 unordered_map 来记忆化搜索。

接着就是细节问题。

但是你这样只能跑 90pts,我们发现考虑单出的时候太耗费时间了,可以直接单独处理。

此题代码也可通过加强版。

Sunday(3.8)

「JOI 2013 Final」现代豪宅

回归 rk 7。

  • 赛时:

思路很简单,我们发现对于 $n,m \le 2 \times 10^3$ 的数据,只需考虑从 $(1,1)$ 到当前点的最短路即可。

再次思考会发现我们似乎只用考虑起点,终点以及有按钮的点的最短路即可,这只需转移同一行与列即可。

最终拿到 80pts。

  • 赛后:

再次思考后发现,似乎不用向其他点转移,只需向左右两个点转移即可。

Week 2

Monday(3.9)

P6007 [USACO20JAN] Springboards G

赛时以为和前一天的题类似,一直在思考如何优化建图(好像是用 CDQ 分治),赛时没调出来,炸飞了。

我们发现如果这题是建图跑拓扑的话,就像一个我为人人的 DP,这样是不好做的。

我们可以考虑换一种思路,考虑人人为我的 DP。

这似乎就显然了,只需考虑在 $x$、$y$ 值比我小的数转移即可。

这只需按照 $x$ 排序,然后把剩下的数扔到树状数组上即可。

Tuesday(3.10)

P5017 [NOIP 2018 普及组] 摆渡车

如此唐题,为何没切?

(原来是自信提交后才发现做法假了)。

好像可以斜率优化来做,但是记忆化搜索应该就够了。

  • 赛时:

似乎可以考虑区间 DP,只需转移 $f_{i,j}$ 以及 $g_{i,j}$ 分别定义为 $i$ 到 $j$ 号点最短等待时间和 $i$ 到 $j$ 号点且 $i-1$ 号点所在时间点被运走的最短等待时间。

很明显,假了。

  • 赛后:

我们发现无法定义上一辆车是啥时候走的,那可以考虑直接枚举,这样可以得到 30pts。

后来又发现,我们只需考虑当前这个点与上一个开车点的间隔即可转移,复杂度 $O(n^2)$。

Wednesday(3.11)

P10138 [USACO24JAN] Cowmpetency G

又是数数题,又是挂分的一天。

我们可以考虑计算 $f_{i,j}$ 表示对于前 $i$ 个数,最大值为 $j$ 的所有合法方案,再用前缀和优化即可做到 $O(nc \log v)$。

我们可以考虑区间离散化,把它按照区间离散成点,这样就可以做到 $O(qc \log v)$。

Thursday(3.12)

P9981 [USACO23DEC] Minimum Longest Trip G

这应该是最长路树的板子,也是难得的场切。

首先,处理出最长路的长度还是容易的,只需一个拓扑排序即可。

我们可以考虑把会考虑的点拎出来,这样就会形成一颗最长路树,我们发现对于这样一棵树,深度(这里把结点的深度定义为最长路长度,因为有可能存在多个根节点但不同根节点之间的深度可能不同)相同的点之间是可以根据它们子节点的字典序大小来排序的,具体方法如下:

  • 比较与子节点连边的边权内最小的边权

  • 比较所选子节点的排名

就做完了,有点常数,但不需要优化。

Sunday(3.15)

P7201 [COCI 2019/2020 #1] Džumbus

这个满级题面,不想喷了。

思路还是很简单的,发现建边之后就是一个森林,这启发我们可以设置一个超级源点来转化题面为树上背包问题。

我们发现,对于点 $x$ 它的贡献可能为 $0$ 到 $2$ 之间不等,所以需要分讨。

定义 $f_{x,j,0/1,0/1}$ 表示对于点 $x$ 及其子树内选择了 $j$ 个有效点,当前这个点没选、选,且其儿子没有、有被选的最小代价。

转移有点难写,这边直接把代码粘上去:

f[x][j+k+2][1][1]=min(f[x][j+k+2][1][1],f[x][j][1][0]+f[it][k][1][0]);

f[x][j+k+1][1][1]=min({f[x][j+k+1][1][1],f[x][j][1][0]+f[it][k][1][1],f[x][j][1][1]+f[it][k][1][0]});

f[x][j+k][1][1]=min({f[x][j+k][1][1],f[x][j][1][1]+f[it][k][0][0],f[x][j][1][1]+f[it][k][1][1]});

f[x][j+k][1][0]=min(f[x][j+k][1][0],f[x][j][1][0]+f[it][k][0][0]);

f[x][j+k][0][0]=min({f[x][j+k][0][0],f[x][j][0][0]+f[it][k][0][0],f[x][j][0][0]+f[it][k][1][0],f[x][j][0][0]+f[it][k][1][1]});

Week 3

Monday(3.16)

P5021 [NOIP 2018 提高组] 赛道修建

最小值最大,这很容易想到二分,但如何在 $O(n \log n)$ 的复杂度内写出 check 是需要考虑的。

我们容易想到一个 $O(n^2)$ 的 DP 来解决,定义 $f_{i,j}$ 表示在以 $i$ 为根的子树内,$i$ 所在链的长度为 $j$ 的情况下有多少条链满足要求。

虽然有了思路,但这个 DP 并不好优化,由此,我们可以考虑贪心。

我们发现,对于当前这个点 $i$ 它及它的子树内的满足的链的长度是可以确定的,这只需贪心处理当前这个节点与它的儿子节点之间的边,如果说儿子节点所在的链 $\ge$ 所验证的长度,那答案就加一,否则贪心的匹配结果即可。

Tuesday(3.17)

P11830 [省选联考 2025] 幸运数字

我在 CWOI 2026 2,3月晚练中只挂了 389pts,你也来试试吧

这次是因为忘记判断区间不连续导致的。

我们发现对于 A 性质是好做的,对于 $x$,我们只需处理出一定小于它的数量的最大与最小值,以及一定大于它的数量的最大与最小值,最后判断这个值是否可行即可。

至于 100pts,只需处理离散化一下即可。

Wednesday(3.18)

我咋这么唐。

P3647 [APIO2014] 连珠线

事实上,$O(n^2)$ 的 DP 还是好想的,我们可以枚举节点 $x$ 作为根节点,并定义 $f_{i,0/1}$ 表示当前这个点是不是在父亲生成之前生成的,定义有很多种,但转移都是一样的:

$$
f_{i,0}= \sum {j \in son_i} \max {f,f_{j,1}+w}

\

f_{i,1}=\sum {j \in son_i} f - \max {f_{j,0},f_{j,1}+w} + f_{j,1} + w
$$

最后考虑换根 DP 即可。

Thursday(3.19)

2、3 月榜单已经废了。

P4006 [清华集训 2017] 小 Y 和二叉树

我们可以考虑最后答案中的第一个位置是什么,发现只要它不会强制作为根(即边数不超过 $2$)即可,这只需找到第一个点满足条件的然后考虑即可。

对于点 $x$,我们需要考虑它以及它的子树内的点的最小字典序,因为每个点的编号是不同的,这启示我们只需统计第一位(后文记为 $mn_x$)即可。

在这里,对于不同的边数我们需要分类讨论($x$ 是从左儿子传上来的):

  • 边数为 0。

这很显然了,把 $x$ 加入答案即可。

  • 边数为 1。

我们需要考虑当前这个点唯一连向的点(记为 $v$)当 $x$ 的父亲还是儿子,比较显然的是如果 $mn_v>=v$ 则当父亲,至于为什么可以取等,因为当父亲的情况一定是包含当儿子的。

  • 边数为 2。

这只需要考虑两个节点的 $mn$ 谁更小,更小的当儿子,大的当父亲。

具体实现只需处理三个 DFS,一个计算 $mn_x$,一个计算左儿子计算过了的情况,一个计算父亲计算过了的情况。

Sunday(3.22)

AT_abc319_g [ABC319G] Counting Shortest Paths

  • 赛时

我们发现,对于比较大的数,它的最短路径一定比较小(正确性显然),所以可以考虑数据点分治,考虑跑 dij 处理 $n \le 5000$ 的情况,剩下的判一下即可获得 74pts。

  • 赛后

因为赛时考虑了数据点分治,这里仍可以接着讨论 $n \ge 5000$ 的情况,我们发现,对于此的答案是有限的(具体是多少我也不知道),但我们可以考虑计算 $f_{i,j}$ 表示走 $i$ 步到达 $j$ 的所有方案数。

转移应当是简单的:

$$
f_{i,j}=\sum {(j,k) \in E} f
$$

但是这样下来复杂度有点高,可以考虑从总方案中减去不合法的,即:

$$
f_{i,j}=sum - \sum {(j,k) \not \in f{i-1,k}} f_{i-1,k}
$$

其中 $sum$ 为上一轮中的各个点的方案数之和。

Week 4

Monday(3.23)

P5665 [CSP-S 2019] 划分

难得的没有挂分。

赛后听 hb314 说这似乎是去年暑假集训的一场 T3,但当时都没人改(主要对于当时的我们还是太难了)。

  • 赛时

首先先想到 $O(n^2)$ 的一个 DP,可以定义 $f_i$ 表示前 $i$ 个数处理起来的最小值,$g_i$ 则表示 $i$ 所在块的和是多少。

这个应当是好转移的,只需找到从后往前第一个满足 $g_j \le sum_i - sum_j$ 的位置即可,虽然不会证明正确性。

对于 $O(n \log n)$ 的做法,思考了很久,考虑过双指针和二分,但 $g$ 数组似乎不满足单调性,所以这里就考虑用堆来实现。

可以考虑实现一个小根堆(这里需要将上面的式子转化成 $g_j + sum_j \le sum_i$),每次取出堆顶的元素,看看是否满足要求,满足就更新最大值即可。

这样可以获得 88pts 的成绩。

  • 赛后

原本通过不能二分和双指针已经觉得和单调性没啥关系了,结果来了个单调队列?

事实上,我们可以考虑在计算完 $i$ 之后剔除掉在 $i$ 之前出现的且 $sum_j + g_j \ge sum_i + g_i$ 的所有值,正确性是显然的,这只需要一个单调队列维护即可。

Tuesday(3.25)

P15819 [JOI 2015 Final] 舞会 / Ball & AT_joi2015ho_d 舞踏会 (Ball)

唐飞的一天。

我们发现对于不确定的位置是不好贪心求解的(赛时还在想这个的正确性),我们可以考虑二分和模拟,以及树形 DP。

这里提供二分加模拟的做法。

我们可以考虑对于数 $x$,要使它作为最后一个的最小代价是多少

有一个很经典的 trick:将所有的 $d_i \ge x$ 贵族改为 1,其他改为 0。

考虑到我们最后若想要此种情况成立,需要最后留下来的贵族是 1 才行。

我们观察题目的操作,容易得出当知道所有数时,可以用 deque 来维护,这里 deque 中存的每一位是当前局面下使得这一位为 1 的最小值。

那么对于初始固定的位置,若它对应的贵族是 1,则值是 0,若是 0,则设为极大值(即不行),若这个位置没有初始值,则设为 1,因为需要往这里填入一个是 1 的贵族。

按照题意模拟,每次取出前三个,若要使得加到最后的是 1,则前三个中必须至少有两个 1,枚举三种情况,取最小值,将其加到末尾。

最后将最后一个提取出来,并判断它为 1 时所需要的 1 数量是否小于等于总的 1 数量即可。

Wednesday(3.25)

P9018 [USACO23JAN] Moo Route G

又是赛后秒改的一天。

赛时想了个线段树维护区间最小值,考虑以 $i$ 为起点所连出的不同种类的边的数量,结果直接伪了。

我们发现最优策略肯定是一次往返中所经过的点的数量越多越好,那这里我们就可以考虑对于位置 $i.5$ 所对答案造成的贡献。

  • $a_i \le a_{i-1}$

在这种情况下,经过了 $i.5$ 的边一定会经过 $(i-1).5$,对此,我们只需计算上一个点所经过的边(即 $a_{i-1}$)中选出 $a_i$ 即可。

  • $a_i \ge a_{i-1}$

在这种情况下,经过了 $(i-1).5$ 的边一定会经过 $i.5$,这时,我们只需要考虑经过 $i.5$ 的边中,插入以 $i$ 为起点的边的方案。

因为这之间有 $a_i - 1$ 个不同的位置,所以相当于是在 $a_i - 1$ 个位置中塞入 $a_i - a_{i-1}$ 个球。

总的方案:

$$
\prod {i=1} ^ {n-1} {\binom {a{i-1}} {a_i} + \binom {a_i - 1} {a_i - a_{i-1}}}
$$

Thursday(3.26)

P9352 [JOI 2023 Final] 训猫 / Cat Exercise & AT_abc435_f [ABC435F] Cat exercise

赛时看错题导致先写了第二题和第一题的 41pts 的,但为何没有判断 l>r 挂飞了呢?

我在 CWOI 2026 2,3月晚练中只挂了 430pts,你也来试试吧

对于 T2 & T1 Subtask 5 应当是容易的,考虑分治的同时用 ST 表来维护即可(但为何砸了颗线段树呢?)。

对于 T1,我们发现贪心去查找似乎复杂度极高,所以这里可以考虑 DP。

定义 $f_i$ 表示以 $i$ 为根的子树中可以走的最大距离,设 $g_i$ 表示以 $i$ 为根的子树中的最大点的值。

转移是显然的:

$$
f_i = \max {v \in son_i} {f + dis_{i,g_v}}
$$

其中 $dis_{i,j}$ 表示 $i$ 和 $j$ 之间的距离。

接下来考虑如何实现。

由于猫行走到的节点的高度呈单调递减,则必须先转移小的值 $v$,才能对大的值 $u$ 进行转移。

那么我们可以考虑在连边时连接 $u$ 和 $v$,这样我们从 $1$ 至 $n$ 对每一个节点进行转移。

对于 $g_i$ 我们可以用并查集来维护,对于 $dis_{i,j}$,我们使用 lca 进行求解即可,时间复杂度:$O(n (\log n + \alpha(n)))$。

Sunday(3.29)

P9322 [EGOI 2022] Superpiece / 超级棋子

大分讨,好难写。

这里我们主要思考马的情况,打打表找一下规律:

  0  3  2  3  2  3  4  5  4  5  6  7  6  7  8  9  8  9 10
  3  2  1  2  3  4  3  4  5  6  5  6  7  8  7  8  9 10  9
  2  1  4  3  2  3  4  5  4  5  6  7  6  7  8  9  8  9 10
  3  2  3  2  3  4  3  4  5  6  5  6  7  8  7  8  9 10  9
  2  3  2  3  4  3  4  5  4  5  6  7  6  7  8  9  8  9 10
  3  4  3  4  3  4  5  4  5  6  5  6  7  8  7  8  9 10  9
  4  3  4  3  4  5  4  5  6  5  6  7  6  7  8  9  8  9 10
  5  4  5  4  5  4  5  6  5  6  7  6  7  8  7  8  9 10  9
  4  5  4  5  4  5  6  5  6  7  6  7  8  7  8  9  8  9 10
  5  6  5  6  5  6  5  6  7  6  7  8  7  8  9  8  9 10  9
  6  5  6  5  6  5  6  7  6  7  8  7  8  9  8  9 10  9 10
  7  6  7  6  7  6  7  6  7  8  7  8  9  8  9 10  9 10 11
  6  7  6  7  6  7  6  7  8  7  8  9  8  9 10  9 10 11 10
  7  8  7  8  7  8  7  8  7  8  9  8  9 10  9 10 11 10 11
  8  7  8  7  8  7  8  7  8  9  8  9 10  9 10 11 10 11 12
  9  8  9  8  9  8  9  8  9  8  9 10  9 10 11 10 11 12 11
  8  9  8  9  8  9  8  9  8  9 10  9 10 11 10 11 12 11 12
  9 10  9 10  9 10  9 10  9 10  9 10 11 10 11 12 11 12 13
 10  9 10  9 10  9 10  9 10  9 10 11 10 11 12 11 12 13 12
 11 10 11 10 11 10 11 10 11 10 11 10 11 12 11 12 13 12 13
 10 11 10 11 10 11 10 11 10 11 10 11 12 11 12 13 12 13 14
 11 12 11 12 11 12 11 12 11 12 11 12 11 12 13 12 13 14 13

我们发现有几个点需要特殊判断一下:

  • $(1,0)$ & $(0,1)$

这两个点的值都是 $3$。

  • $(2,2)$

这个值是 $4$。

单独讨论之后可以算出最基础的值,即:

$$
num = \max(\lceil \frac{x}{2} \rceil,\lceil \frac{y}{2} \rceil,\lceil \frac{x+y}{3} \rceil);
$$

我们又需要考虑额外的附加值,即:

$$
(x \oplus y \oplus num) & 1
$$

这样马也就计算完了。

Week 5

Monday(3.30)

P4364 [九省联考 2018] IIIDX

这是三月份最后一场了。

  • 赛时

想到一种错误的解法,可以考虑对于位置 $x$ 有多少个值是要 $\ge d_x$,这里提示我们可以考虑向受它影响的点建边然后计算子树内的点的数量,贪心去取即可获得 60pts。

为什么错了呢,hack 是这个:4 3 1 1 2 2 这里我们会输出 1 1 2 2 但事实上 1 2 2 1 也是一个正确的选择。

通过这组数据我们发现,基于 DFS 的贪心都不能够确保正确性,由于存在重复,所以儿子节点可能可以选择和父亲节点相同的数,把更大的数留给其他节点,使解更优。

  • 赛后

我们发现,假如我们要选的数为 $x$,那 $sz_x$ 一定是 $\le f_x$ 的,其中 $f_x$ 表示剩余的 $\ge x$ 的数的后缀和。

这里我们就可以考虑对于同一层的数来集中求解。

因为要求字典序最小,所以父亲选的值越大越好,如果说父亲选的值的数量不只一个,那父亲选择最靠前的一个一定是更优的,这样儿子的选择就更多了。

这样提示我们可以考虑线段树二分来解决问题,每次选完之后要给儿子留下足够的点数,于是需要减去自己的子树数量。

查询儿子时,只需考虑父亲节点是否还原了再查询即可。

April

Week 1

Wednesday(4.1)

P15567 [COCI 2025/2026 #5] 五步 / Pet

咋说,赛时的转移,初始化都没问题,只是从 93pts -> 110pts 的优化炸了,直接 0pts。

link

转移是简单的,我们考虑记录 $f_{i,j,k,0/1}$ 表示走 $k$ 步走到 $(i,j)$ 且最后一步是横/竖着走的方案数。

转移是显然的:

$$
f_{i,j,k,0} = \sum {l=1} ^ {n} f - f_{i,j,k-1,1}

\

f_{i,j,k,1} = \sum {l=1} ^ {m} f - f_{i,j,k-1,0}
$$

用前缀和优化即可。

我们发现,在只走 $5$ 步的情况下,只有可能最后一步和第一步重合,只会形成一个长方形。

于是开始考虑枚举长方形的左上角与右下角进行容斥,这样就获得了 0pts 的好成绩。

事实上,我们可以考虑设第 $i$ 行与第 $j$ 行有 $k$ 个都有荷叶的位置($i < j$),用答案减去 $k \times (k-1) \times 4$ 即可,这样你可以获得 93pts。

我们考虑用 bitset 优化这一过程,这样复杂度就是 $O(nm + \frac {n^2 m} {w})$。

Thursday(4.2)

P13308 故障 & P12247 跳舞机

不想多说(至少现在):f[i-k] -> f[i-k+1]。

“身为迷失的孩子,即使那么不情愿,也还是需要那份爱吗?”

真 TM 想死。

我们可以考虑维护这个明显具有单调性的三维偏序问题,如果没有考虑兴奋值,这只需一个 set 即可,在考虑兴奋值的情况下用两个 set 维护一下即可。

不想多说了,直接暴力 $O(n^2 m)$ 离散化一下再加上卡常,可以做到 $O(nm \log m)$。

Week 2

Tuesday(4.7)

P15939 [JOI Final 2026] 传奇团子吃家 / Legendary Dango Eater & AT_joi2026final_a 伝説の団子食通 (Legendary Dango Eater)

依旧 JOI,依旧写不出来。

我们考虑 $O(q n)$ 的暴力,这里给出一个性质,我们记录 $s$ 表示上一位剩余的数量,发现当 $s \ge 0$ 时它所做出的贡献正是 $\frac {sum} {k}$ 其中 $sum$ 是前缀和。

对于 $s<0$ 的情况,但这时 $s$ 取到 0,再继续往后遍历。

这可以视作重新开始,于是将整个过程分为若干段,每段从 $s=0$ 开始,一直到 $s<0$ 结束,然后重置 $s=0$,开启下一段。

若我们将每走一段看做“跳”,那么从任意点开始“跳”的路径是确定的,所以倍增预处理出来,查询时倍增跳即可。

这里可以考虑用颜色均摊或线段树维护,时间复杂度 $O(n \log n)$。

Wednesday(4.8)

P14645 [POI 2025/2026 #1] 传话 / Dostawy

link

我们发现贪心是好想的,只需考虑每个点所到达的最短时间,按照时间大小从大往小排序即可。

因为不同出发的点都带有权值(即它的出发时间),这个东西是不好维护的,但我们可以发现它的出发时间每次最多只会 $+1$ 或 $-1$,而这个操作又是区间修改,这提示我们往线段树上想。

我们可以用线段树维护区间最大值,这样查询是 $O(1)$ 的,我们考虑对于未出现的时间,这些点是不需要更新的,所以初始值可以直接赋为 0。

考虑对于时间 $\ge$ 新的时间的点是无需改动的,接下来考虑 $<$ 它的部分。

我们发现加入与删除的性质相同,考虑加入即可。

我们发现对于完全 $<$ 加入的时间只需区间 $+1$ 就可以了。

但对于 $=$ 它的点只需修改有多少个数 $\ge$ 它即可,这一点可以用树状数组维护。

赛时没想到可以直接区间减去之前的权值,原本以为需要在 push_up 时来完成,复杂度就变为了 $O(n \log ^2 n)$。

Friday/Thursday(4.9/4.10)

P11022 「LAOI-6」Yet Another Graph Coloration Problem & P12415 「YLLOI-R1-T4」枫

依旧绿绿得紫,依旧切 T2,不切 T1。

事实上现在还不知 T1 为何 WA。

我们可以考虑边双缩点后看连接两个边双的路径的两点必须是同一颜色,而边双内部的点是啥颜色都可以,用并查集优化即可。

我们发现可以考虑每一层对答案做出的贡献,这需要考虑之前所出现点的数量(即考虑有多少个点能作为这一层点的父亲),剩下的就是 DP 或 DFS 解决了,定义 $f_{i,j}$ 表示还剩 $i$ 层且前面有 $j$ 个父亲可以选择,转移是显然的:

$$
f_{i,j}=\sum ^{m} {k=0} f \times j^k \times \binom {m} {k}
$$

Week 3

Monday(4.13)

P3523 [POI 2011] DYN-Dynamite

难崩的是只需把我自认为错误的 40pts 暴力删掉一维,改一下参数就过了。

容易的是想到二分答案,考虑二分最短时间 $val$。

我们考虑定义 $f_{i,0/1}$ 分别表示在 $i$ 的子树内没有被覆盖到的点到 $i$ 的距离和距离 $i$ 最近的起始点的位置。

当然,初始情况下的转移是显然的:

$$
f_{i,0} = \min _{v \in son_i} f{v,0} + 1

\

f_{i,1} = \min _{v \in son_i} f{v,1} + 1
$$

剩下就是分讨了:

  • $f_{i,0} + f_{i,1} \le val$

这样子树内都会被覆盖完,重置一下 $f_{i,0}$ 即可。

  • 如果说 $i$ 号点上有且 $f_{i,1} > val$

我们可以考虑扔给它的父亲节点来处理,即:$f_{i,0} = \max {f_{i,0},0}$。

  • $f_{i,0}=val$

这种情况下必须选择 $i$ 了,然后让统计个数的 $cnt$ 加一,重置 $f_{i,0/1}$。

最后特判一下根即可。

Tuesday(4.14)

P11187 配对序列 & P12000 扶苏出勤日记

为何把 T2 的前缀和写错、没开 long long、写 st 表查询写成 $O(\log n)$ 的了呢?

考虑用记录 $f_{i,0/1}$ 表示当前结尾为 $i$ 且长度为偶数/奇数的最长距离。

转移是显然的:

$$
f_{a_i,0} = f_{a_i,1} + 1

\

f_{a_i,1} = \max {j \not = a_i} f +1
$$

发现对于 $f_{i,1}$ 是可以用数组维护的,我们可以考虑用线段树来维护 $f_{i,0}$。

很明显,这题是具有二分性质的,我们可以考虑二分答案。

对于二分出来的数 $x$,我们考虑贪心的留下尽可能多的钱为后续买币提供便利。

每当当前所存的币不够是,我们要考虑尽量用早出现的钱来花费(记录 $l$ 表示最早的还剩钱的时间),我们考虑在剩余钱在 $a_i$ 最大的时间来花费钱即可。

查询 $(l,i)$ 之间花费最大的位置可以用 st 表来实现。

Wednesday(4.15)

P3545 [POI 2012] HUR-Warehouse Store

为何没有判 !q.empty()? 被 STL 背刺的一天。

做题 20 分钟,写 check 半小时。

事实上,我们发现如果当前这个点比之前的选的数出现的最大值要小,那可以把之前这个最大值所在编号的点弹出,并把之后的值往前移动一位即可。

对于最后一步,可以在最后来处理。

Thursday(4.16)

P15093 [UOI 2025 II Stage] Odd Rows

link

不难想到这是一个我为人人的 DP,我们定义 $f_{i,j}$ 表示对于前 $i$ 列能否做到其中有且仅有 $j$ 行存在奇数个 1。

我们发现对于 $f_{i,j}$ 它所能转移到的位置是一个区间,并且这个区间中只有奇数或者偶数能被修改,这提示我们可以拿一颗线段树来维护 $f_{i+1,x}$。

答案显然是所有的 $f_{m,j} = 1$ 中 $j$ 的最大值,这样你可以获得 50pts。

我们考虑答案的构造,我们需要知道当第 $i$ 列构造完了有多少行包含奇数个 1,我们发现,对于这个是好维护的,倒着再模拟整个过程一次就可以了。

考虑记录第 $i$ 列结束后有 $g_i$ 个位置包含奇数个 1,那对于第 $i$ 列,我们考虑它相较于第 $i-1$ 列多出现了几个位置包含奇数个 1(记为 $p$)。

我们发现,对于剩下的值即 $c_i - p$ 均匀的覆盖包含和不包含奇数个 1 的位置即可。

Week 4

Monday(4.20)

P15301 [ROI 2012 Day 2] army 汗国军队

难得的没有挂分。

  • 赛时:

考虑处理第 $i$ 位填什么值,考虑将这个值填进去后 LIS 又发生了啥变化,具体的记录 $q_i$ 表示长度为 $i$ 的 LIS 末尾的值最小为多少,转移是显然的:

$$
q_i = \begin{cases}
q_i & q_{i-1} > x \ | \ q_{i} < x\
x & q_{i-1} < x \ & \ q_{i} > x
\end{cases}
$$

这样可以获得 70pts。

  • 赛后

我们考虑这道题目的弱化版:对于一个长为 $n$ 的排列,存在多少个序列使得序列中的 LIS 长为 $k$。

LIS 可以用 DP 维护,这里我们维护数组 $f_i$,表示前缀 $[1,i]$ 中,LIS 的长度。当我们在位置 $x$ 后插入数时,数组 $f$ 会发生如下变化:

$$
f_i = \begin{cases} f_i & i \le x \ f_{i-1} + 1 & i = x + 1 \ \max {f_i , f_{i-1}} & i > x\end{cases}
$$

我们发现对于 $f_i$ 和 $f_{i-1}$ 二者的差值一定 $\in {0,1}$ 所以可以考虑状压这个来进行转移,最后计算这个状压下来的序列是否 $= k$ 即可。

对于原题考虑在记录一个 $j$ 表示上一个目标位置所在的位置即可。

Tuesday(4.21)

P12675 「LAOI-8」Boundary & P3419 [POI 2005] SAM-Toy Cars

切蓝不切绿?

对于这题考虑分为一下几种情况:

  1. 从 $1$ 到 $n$ 一步消完

  2. 中间找一个分割点,分两部分消完

  3. 寻找两个点 $x,y$($x < y$)消除 $1$ 到 $x$ 和 $y$ 到 $n$,再用 $x$ 和 $y$ 消除中间

  4. 寻找两个点 $x,y$($x < y$)消除 $1$ 到 $x$ 和 $y$ 到 $n$,再用 $x+1$ 和 $y-1$ 消除中间

就做完了。

一眼的思路就是对于 $a_i$ 如果事先出现在地下,那就不用管它,否则考虑地上的车辆是否 $< k$,小于则放置,否则考虑删除现存的车中最接近的出现位置的车辆,这用 set 维护即可。

Wednesday(4.22)

P15352 [COCI 2025/2026 #4] 魔术 / Magija

真 TM 想死。

赛时想了一种用分块维护区间并查集的做法,但对于每个点的并查集状态不同,所找到的值也不同,所以这种方案不行(真 TM 绝望)。

考虑做出 73pts 的做法,小常数维护并查集,这用并查集随便做。

我们发现,瓶颈还是在操作二上,这提示我们可以用一种类似于线段树的区间分割来维护,这里考虑对于区间 $(l_1,r_1)$ 和区间 $(l_2,r_2)$ 是否祖先一致(这里指的是并查集的祖先),不一致则继续往下,直到 $l_1 = r_1$ 或祖先相同即可。

我们发现这样维护是不容易的,因为每次维护都覆盖两个区间,具体的,我们考虑对于二进制下的每一位来处理,复杂度 $O(n \log n)$。

Thursday(4.23)

P12917 [POI 2021/2022 R3] 小矮人派对 2 / Impreza krasnali 2

赛时 5min 打完 42pts,坐牢 1h25min?

  • 赛时

考虑 DFS,我们可以找到每个数所出现的位置的并集即是它所处位置的范围,考虑单独处理没出现的数的数量,DFS 处理剩余的值即可拿到 42pts。

  • 赛后

和 42pts 一样,考虑单独处理没出现的数(数量记为 $k$),考虑 DP 处理,因为这个数要考虑 $i-1,i,i+1$ 三个位置,所以状态定义要有 5 层转移,定义 $f_{i,0/1/2/3/4}$ 分别表示:

  1. $a_i \to i$
  2. $a_i \to i-1 \ & \ a_{i-1} \not \to i$
  3. $a_i \to i-1 \ & \ a_{i-1} \to i$
  4. $a_i \to i+1 \ & \ a_{i-1} \to i$
  5. $a_i \to i+1 \ & \ a_{i-1} \not \to i$

分情况考虑即可:

  1. $a_i = a_{i-1} = a_{i-2}$

$$
f_{i,1} = f_{i-1,0}
$$

  1. $a_i = a_{i-1} \not = a_{i-2}$

$$
f_{i,1} = f_{i-1,2}

\

f_{i,2} = f_{i-1,3}
$$

  1. $a_i = a_{i-1} \not = a_{i-2}$

$$
f_{i,0} = f_{i-1,3} + f_{i-1,4}

\

f_{i,1} = f_{i-1,0}
$$

  1. $a_i \not = a_{i-1} \ & \ a_i \not = a_{i-2}$

$$
f_{i,0} = f_{i-1,0} + f_{i-1,1} + f_{i-1,2}

\

f_{i,1} = f_{i-1,1}

\

f_{i,2} = f_{i-1,4}

\

f_{i,3} = f_{i-1,3} + f_{i-1,4}

\

f_{i,4} = f_{i-1,0} + f_{i-1,1} + f_{i-1,2}
$$

最后答案就是:

$$
(f_{n,0} + f_{n,1} + f_{n,2}) \times \prod ^{k} _{i=1} i
$$

Sunday(4.26)

P6772 [NOI2020] 美食家

首先容易想到一个 $O((n+m) T)$ 的 DP 解法,这可以拿到 40pts。

考虑环上的特殊性质,这可以拿到 50pts。

话说似乎 1000 行了。

我们发现 $n \le 50$ 似乎很小,这提示我们考虑矩乘来维护这个东西,这样就会 65pts 了。

再次考虑发现这个举办美食节的操作的影响只限于当前时刻的值,这提示我们可以分为 $k$ 段处理,但是这样有可能要预处理出 $T$ 时刻的矩阵,这是不优的。

我们考虑二进制拆分这个东西,复杂度就降下来了。

Week 5

Monday(4.27)

P10837 『FLA - I』云音泛 & P11969 「ALFR Round 7」T2 Game

T2 读错题了,以为 $i$ 和 $j$ 不能相同 -95pts。

似乎一眼啊,考虑处理出这个区间所做的贡献,在考虑这个区间内有多少个位置为两朵花即可。

不想喷了,分开讨论即可,注意一下细节。

Tuesday(4.28)

P14598 [COCI 2025/2026 #2] 搭塔 / Tornjevi

这是四月份首个完全 AC(绷)。

这题应当是满足结合律的,所以考虑数据结构进行区间维护。

我们发现可以倒着考虑,用数据结构维护在区间内需要多少个 $P,C$ 顶部有多少个 $P,C$,对于 $P,C$ 分别分情况讨论即可(下面以 $P$ 为例,其中 $g_i$ 表示需要的个数,$f_i$ 表示顶部的个数,$cnt$ 为之后顶部为 $C$ 的个数):

  • $g_i \le cnt$

$$
cnt = cnt - g_i + f_i
$$

  • $g_i > cnt$

$$
cnt = f_i
$$

用分块维护即可。

Wednesday(4.19)

P9402 [POI 2020/2021 R3] Droga do domu

难绷的是二分写错了。

通过二分我们可以处理出每条线路中的点与后一个点之间的距离。

通过这个图,我们可以考虑分层图,定义 $f_{i,j,k}$ 表示对于点 $i$ 考虑正好转了 $j$ 条路当前为 $k$ 号路的最短时间。

显然的通过边的转移以及自己点的转移即可完成。

但这题卡常,所以是通过评测机波动卡过的。

May

Week 2

Tuesday(5.5)

P8163 [JOI 2022 Final] 铁路旅行 2 / Railway Trip 2

打 CF 打一半过来写总结,因为 E 似乎是个屎题。

发现这似乎只和一个点能一次性到达的最大以及最小点有关系。

这提示我们可以用线段树优化建图过程(区间覆盖+单点查询),然后考虑倍增处理这个点所能在 $2^k$ 内到达的点的范围,这里也可以用线段树来实现。

考虑传统倍增查询的过程,可以考虑记录点的转移位置于是不知为何的 WA 了。

我们可以考虑维护一下查询区间的左右端点,这样即可通过本题,复杂度:$O(n \log ^2 n)$。

Wednesday(5.6)

P15984 [PA 2026] 竞选 / Kampania wyborcza

改了一天的 WA,但最后还是 T 了。

思路是比较显然的,考虑处理出相同点的联通块,考虑倒着处理这个东西。

对于已经没有颜色的联通块,考虑把相邻的部分缩成一个点,并把边都合并到这一个点上,然后处理可覆盖情况即可获得 60pts。

(upd:5.28)

我是 Tang,剩下的可以直接拿并查集优化出来的。

发现缩点重新建边是费时间的,考虑说可以直接用并查集缩点节省时间。

Thursday(5.7)

P14779 [COCI 2025/2026 #3] 宴会 / Domjenak

link

赛时太多地方忘记把 n -> n*2,挂完了。

首先考虑确定出互相对应的两个点,这里可以考虑拓扑。

考虑令需要更新的点令为 0,反之则为 1,这个图就是 01 间隔的一张图。

由于规则四以及唯一性,我们可以考虑对于所有为 1 的点向它所连的点进行拓扑,这样当一个为 0 的点只剩下一条连边时就是和它配对的点。

我们发现,每个图是可以拆成一条条链,对于每条链都是 0/1 间隔的,但转换成图时,某一些点与它的朋友的颜色会相同。

这又发现对于答案肯定是同伴到朋友再到同伴以此类推。

这提示我们可以让同伴的朋友向当前点建边,这样就形成了一个 DAG,可以拓扑了。

在拓扑过程中考虑对连向的点进行转移(在图中就是一个由下到上的运动),最后输出路径即可。

Thursday(5.8)

P9374 「DROI」Round 2 单图

赛时想找性质,结果死活枚不出来 $n$ 为 4 时的 108 种情况。

发现合法的单图是由二元环和最长链长度不超过二的图组成。

考虑分别处理二元环和链的情况。

对于二元环,定义 $g_i$ 表示对于有 $i$ 个点的二元环的所有方案,转移应当是显然的:

$$
g_i = g_{i-1} \times (i-1)
$$

考虑对于链的情况,定义 $f_i$ 表示对于有 $i$ 个点的链的所有方案数:

$$
f_i = \sum _{j = 0} ^{i - 1} \binom {i} {j} \times (2^{i-j} - 1) ^ j
$$

答案只需枚举有多少个二元环即可即:

$$
ans = \sum {i = 0} ^{\lfloor \frac{n}{2} \rfloor} f \times g_{2i} \times \binom {n} {2i}
$$

Week 3

Monday(5.11)

P4054 [JSOI2009] 计数问题

考完语文考晚练是猎奇的。

卡常卡成 60pts。

考虑二维前缀和记录初始的情况,对于点 $(x,y)$ 的下半区,考虑在 $(z,y)$ 上标记一下($x \le z$),这显然是二维前缀和和差分的板子了,考虑查询时统计一下前缀即可。

Tuesday(5.12)

P3643 [APIO2016] 划艇

似乎赛时所列的状态是错的?

考虑 31pts,发现可以记录每一个值 $j$,小于它的值的个数,这个用离散化 + 树状数组即可完成。

推到 100pts,考虑区间离散化,记录对于区间 $(l,r]$ 这个范围内的方案的个数,还是树状数组维护。

但这样只能拿到 31pts,因为没有考虑有多个点在同一个区间的情况。

考虑定义 $f_{i,j}$ 表示第 $i$ 个学校内在区间 $j$ 内的方案数。

考虑枚举与这同一块内这一位前有多少个数即可。

Wednesday(5.13)

P11255 [GDKOI2023 普及组] 淋雨

似乎是打到最后 10min 发现做法伪了?

  • 赛时

考虑 $f_i$ 表示以 $i$ 为起点的所能到达的最多的雨的个数。

然后就是拆绝对值、列式子。

  • 赛后

发现这是个二维偏序问题,但似乎要通过拆绝对值做成三维偏序,这提示我们可以考虑 CDQ 分治。

但这样似乎麻烦了。

考虑赛时的方程,两个雨滴可以转移的条件是:$t_b \ge t_a \vee (t_a - t_b) \times v_c \ge |x_a - x_b|$。

分类讨论拆开绝对值后发现这等价于一个在线一维数点问题,个树状数组维护即可。

Thursday(5.14)

P11856 [CSP-J 2022 山东] 吟诗 & AT_arc058_c [ARC058E] 和風いろはちゃん

赛时似乎少判了条件,挂了 20pts?

考虑正难则反,记录以 $i$ 为结尾的不合法的数量。

考虑记录后 17 位的二进制的值,这样来判定是否合法,这里只考虑不合法的情况。

这似乎是一种新的状压方法,考虑将题目要求压缩进一维,而不是直接枚举答案。

最后用总方案数减去不合法即可。

Sunday(5.17)

P9100 [PA 2020] Miny

link

竞选全谷最慢解法。

定义 $f_i$ 表示不选 $i$ 的时候的方案数,找到一个 $< i$ 中最大的 $j$ 使得 $j$ 能引爆 $i$。

这个引起的性质就是引爆 $j$ 到 $i$ 之间的任意一个,都不会波及到这两个点。

对于 $f_i$ 的转移是显然的:

$$
f_i = \sum _{k = j + 1} ^ {i - 1} f_k
$$

答案就是 $f_{n+1}$。

我们可以用线段树加倍增来处理出每个点所能爆炸的的最大以及最小的点的编号。

然后考虑二分加区间查询处理出对于每个点 $i$ 满足条件的位置的值。

最后用树状数组维护完成答案统计即可。

时间复杂度:$O(n \log ^2 n)$。

Week 4

Monday(5.18)

P4649 [IOI 2007] training 训练路径

赛时想了个非常正确的反贪,结果分讨太多,没法实现。

但似乎不会这个满级树形 DP + 状压。

Tuesday(5.19)

P7804 [JOI Open 2021] 决算报告 / Financial Report

赛时似乎会正解了,但一些 corner case 导致错误。

考虑定义 $f_i$ 表示当 $i$ 为序列最大值时的序列最大权值是多少。

转移应当是显然的,考虑枚举前面的 $j$ 表示在这之前,这个序列的最大值是多少,同时必须在中间插入一些点使得相邻的点的距离 $\le D$。

再考虑发现对于点 $i$ 所做出的贡献是一块区间,这提示我们可以考虑用并查集来维护区间合法性,并用线段树维护查询即可。

Wednesday(5.20)

P4381 [IOI 2008] Island

晚练考原?当时做好像还挺 hard 来着。

发现图是棵基环树,考虑找到其中的环,这里可以考虑拓扑解决(当时写的时候好像在考虑 DFS 来着)。

因为岛只能经过一次,考虑对于每个联通快,处理出树的直径以及除去直径后的最长链。

对于每个联通块考虑是在内部渡船还是链接两个联通块,这个分别处理然后取最大值,记得用单调队列优化即可。

Thursday(5.22)

P5875 [IOI 2014] friend 朋友

交互题不能用 inline 是猎奇的。

考虑定义 $f_{i,0/1}$ 表示不选/选第 $i$ 号点的最大方案。

转移应当是显然的(但赛时 RE 是何意味):

$$
f_{host_i,1} = f_{host_i,1} + \begin{cases} f_{i,0} & protocol_i = 0 \ \max {f_{host_i,0} + f_{i,1} , f_{host_i,1} + \max {f_{i,1},f_{i,0}}} & protocol_i = 1 \ \max {f_{host_i,0} + f_{i,1} , f_{host_i,1} + f_{i,0}} & protocol_i = 2\end{cases}

\

f_{host_i,0} = f_{host_i,0} + \begin{cases} \max {f_{i,0},f_{i,1}} & protocol_i = 0 \ f_{i,0} & protocol_i = 1 \vee protocol_i = 2\end{cases}
$$

注意先转移 $f_{host_0,1}$ 即可。

Sunday(5.24)

P13274 [NOI2025] 三目运算符

赛时推了半个小时的性质,结果败在了初始化?

考虑手模一下后发现这似乎和第一个数量 $\ge 2$ 的 1 的位置以及是否存在 101 的子段。

又因为这是区间操作,所以这可以考虑用线段树维护,统计:左、右边相同的长度以及是否存在 101/010 的序列以及第一个数量 $\ge 2$ 的 1 的位置。

记得清空。

Week 5

Monday(5.25)

P11944 [KTSC 2025] 路网维修 / roadwork

简单题,但我没切。

考虑线性处理发现转移点需要满足 $A_i \not = A_j \land B_i \not = B_j$,考虑记录上一个与这两个值分别不同的转移点,取最小的即可。

至于统计个数,考虑是否 $f_{i-1} = f_i$ 即可。

Wednesday(5.27)

P11049 [IOI 2024] 尼罗河船运

700 通过祭。

我们发现对于 67pts 的做法,可以发现我们只用考虑这一位的上一位以及上一位的上一位和它的组合。

我们考虑一段连续的区间使得区间内相邻两点的距离 $\le d$,如果段的长度是偶数,那么肯定能两两配对全部用 $b_i$,如果长度是奇数那么就要考虑让其中奇数个物品单独过河,讨论一下不难发现肯定是让一个物品单独过。那么我们就要求出所有可以单独过(不影响其他物品两两配对)的物品增量 $a_i - b_i$ 最小是多少。

不影响序列的情况有两种:

  1. 位置与左端点奇偶性相同。
  2. 前一个和后一个的差也满足 d 的限制。

考虑多组询问,当 d 足够大之后,整个序列都将是一段,那么就研究单个以及一段物品合并的过程,发现每个间隔都会连接两段,那么我们只需把询问离线排序,再把间隔长度排序,依次加入并修改即可。

在合并段的同时维护上述两种可删点的信息,由于只需最小值直接取 min 即可。

第一种按前后两个物品重量差排序一起修改。

第二种考虑按奇偶位置处理最小值,然后区间直接合并。

似乎还有 $O(n k^3 \log n)$ 的矩阵做法,但似乎这种方式时间更优,代码更短,用并查集维护即可。

June

Week 1

Thursday(6.11)

P12966 [CCO 2025] Asteroid Mining

排序排反了是啥音?

首先观察题目我们可以发现,如果没有后面的性质,这道题就是一个 01 背包,使用 01 背包可以获得前 3 个点的分数。
观察数据范围,显然 01 背包无法通过本题目。我们观察题目的性质:对于任意两块矿物,其中一块的质量可以被另一块的质量整除。

在最坏情况下,$w_i$ 也只可能有 $\log V$ 种不同情况。

将所有矿物按照 $w_i$ 从小到大排序。对于每种 $w_i$,我们可以贪心的计算出最优使用次数,向答案添加对应个数的矿物。对于剩余的,因为可以整除,所以我们可以合并为高一级的并继续参与计算即可。

Week 2

Monday(6.15)

P8208 [THUPC 2022 初赛] 骰子旅行

link

样例全过结果 0pts?概率除错了,-100pts。

考虑如何定义 $f_{i,j}$ 表示在第 $i$ 次摇骰子之前到达 $j$ 的期望,$f_{i,j}$ 的转移似乎是显然的:

$$
f_{i,j} = \sum {j \in son_k} \frac {f{i-1,k}} {m_k}
$$

其中 $son_k$ 表示 $k$ 能一次到达的点。

考虑再定义一个 $g_{i,j,k}$ 表示对于第 $i$ 次摇骰子之前到达点 $j$,经过 $k$ 的答案的期望。

转移要分情况讨论:

$$
g_{i,j,k} =\frac {f_{i-1,k} \times j} {m_k} + \sum {j \in son_l \land k \not = l} \frac {g{i-1,l,k}} {m_l}
$$

显然的是以上两个转移考虑我为人人似乎更简单,答案就是:$\sum _{i=1} ^{T+1} \sum {j=1} ^{n} g$。

Saturday(6.20)

AT_arc165_e [ARC165E] Random Isolation

2pts 是 hyw。

考虑要求的期望相当于之前每个还可以再次操作的局面出现的概率之和(这些局面必定会贡献出一次操作)。

从树上抠出来一个大小大于 $k$ 的子树,若要在操作中出现它,则需要把与其有边的非子树点先删掉。

令子树大小为 $n$,有 $m$ 个非子树点与其相连。套路地将操作序看成一个排列,排列中有些点会操作,有些不会。

显然只有当 $m$ 个点全排在 $n$ 个点之前时,这个子树会出现。

由于其他点对该排列并不会产生影响,故只考虑这 $n+m$ 个点。

共有 $(n+m)!$ 种排列,其中有 $n!m!$ 种合法,则有 $\frac {n!m!} {(n + m)!}$ 的概率出现这棵子树。尽管有些排列是等价的,但是这些等价排列总的概率等于每个等价排列的概率之和,所以可以看作每个排列出现的概率相同。

剩下的就是跑树上背包。令 $f_{x,i,j}$ 为 $x$ 子树中选了包含 $x$ 在内的 $i$ 个点,有 $j$ 个点与之相连(在 $x$ 之前被删除)的方案数,背包转移一下即可。

Sunday(6.21)

P9474 [yLOI2022] 长安幻世绘

link

唐唐晚练依旧不切(80pts 是 hyw)。

考虑二分答案,这样可以考虑当 $i$ 为最小值时极差为 $x$ 的最长长度,考虑枚举每一位并贪心的选择点,这样可以获得 76pts。

考虑优化贪心选点的步骤,发现把 $a_i$ 排序后可以通过双指针确定合法的点,考虑用线段树处理答案。

具体的,记录区间长度、答案、左边的连续的 $1$ 的个数、右边的连续的 $1$ 的个数,查询时查询根节点的答案即可,push_up 稍微修改一下即可,复杂度是 $O(n \log ^2 n)$。

考虑优掉二分,发现如果说确定了当 $a_i$ 作为最小点的极差最小值,这些点出现在 $a_{i + 1}$(当然这个 $a$ 数组是排过序的)一定是更优的,所以考虑通过双指针枚举当 $a_i$ 要满足条件时最大值最小是多少,这个还是用刚才的线段树实现即可。

Week 3

Monday(6.22)

P8595 「KDOI-02」一个网的路

话说看错题(以为是个图说是),但实际上只写了 20min(结果特判挂了)。

发现将题目转化后可以变为将题目中的每个树转化成链并合并的最小代价,显然的先删点后连边是更优的。

发现这个答案有两个部分组成(删点和最后的连边),不好贪心和维护,考虑 DP 实现。

定义 $f_{i,0/1,0/1}$ 表示对于点 $i$,和父亲连的边是否还存在以及这个点是否删除,显然 $f_{i,1,0}$ 是一个废掉的状态(毕竟都删完了还有边也不可能)。

对于 $f_{i,0,0}$ 发现这个点和它的儿子都不会连边所以答案就是 $2 + \sum {x \in son_i} \min {f \ f_{x,0,1}}$,这个 2 表示删除再加边的花费。

考虑 $f_{i,1,1}$ 显然,我的儿子要么删除,要么和自己连边,但和自己连边就只有一个儿子可以,先记录 $\sum {x \in son_i} f$,再找出其中最大的 $f_{x,1,1} - f_{x,0,0}$ 即可。

对于 $f_{i,0,1}$ 显然,我可以和自己的两个儿子连边,依旧先记录 $\sum {x \in son_i} f$,再找出其中最大和次大的的 $f_{x,1,1} - f_{x,0,0}$ 即可。

答案统计就是 $\left( \sum {x \in son_i} \min {f \ f_{xrt,0,1}} \right) - 1$(毕竟最后总有一个联通块不用加边)。

话说似乎定义 $f_{i,0/1,0/1}$ 为 $i$ 号点删没删以及处于链的端点/中间,但转移似乎常数有点大。

Tuesday(6.23)

P7985 [USACO21DEC] Paired Up P

脑子空转 2h 来的。

对于 $T = 1$ 直接考虑定义 $f_{i,j}$ 表示已经处理到了 G 中的第 $i$ 个点,和 H 中的第 $j$ 个点的最大匹配和,转移是容易的,可以得到 20pts。

考虑 $T = 2$ 的情况,发现可以定义 $f_{i,j,l,0/1}$ 表示已经处理了 G 中的第 $i$ 个点,和 H 中的第 $j$ 个点且上一个没有处理的点在 G/H 中的第 $l$ 个点上的最大失配和,这个 DP 需要分类讨论,考虑当 $x_{a_{i + 1}} > x_{b_l} + k$ 时 $f_{i,j,l,1} \to f_{i + 1,j,i + 1,0}$,同理当 $x_{b_{j + 1}} > x_{a_l} + k$ 时 $f_{i,j,l,0} \to f_{i,j + 1,j + 1,1}$,这可以获得 56pts。

考虑再省去一维,定义 $f_{i,j,0/1}$ 表示上一位没匹配是 G/H(强制要求 $j + 1$ 到 $n$ 不在与 $i$ 之前的数匹配)且已经处理了 G 中的第 $i$ 个点,和 H 中的第 $j$ 个点的最大失配和。

转移时,考虑定义 $r_i$ 表示能和 $i$ 匹配的最后一个点的位置,强制使 $i + 1$ 和 $j + 1$ 匹配,如果成功,则这个位置就可以被 $f_{i,j,0}$ 转移,$f_{i,j,1}$ 的情况同理。

Wednesday(6.24)

CF1854C Expected Destruction

期望废柴。

根据期望的线性性,考虑处理每一位 $i$ 最后消掉的期望步数,发现这个问题可以转化为:一个点追逐上另一个点之后的过程看作删去追逐另一个点的那个点,也就是两点中靠前的那个点的期望步数。

考虑定义 $f_{i,j}$ 表示追逐的点初始位置在 $i$,被追逐的点初始位置在 $j¥ 时删去追逐的点的期望步数。

因为只考虑这一对点,每个点都有一半的概率被选中,转移是显然的:

$$
f_{i,j} = \frac {f_{i+1,j} + 1 + f_{i,j+1}} {2}
$$

答案就是 $m + 1 - a_n + \sum {i = 1} ^{n} f$,预处理 2 的逆元即可。

Sonday(6.28)

CF2207D Boxed Like a Fish

又开始乱特判了。

考虑记录当在这个点时进行“睡觉”操作时是否存在必胜策略。

记录 $f_i$ 表示 $i$ 点和它子树内最近的必胜点的距离。

判定 $i$ 是否是必胜点很简单,判断子树中的最短与次短的值相加 + 1 是否 $\le k$ 即可。

Week 4

Monday(6.29)

P15950 [JOI Final 2026] 电压 2 / Voltage 2 & AT_joi2026final_l 電圧 2 (Voltage 2) & AT_joig2026final_l 電圧 2 (Voltage 2)

54pts -> 22pts -> 10pts。

发现对于一个有环图,似乎不存在可行解能够完全确定,考虑将题目转化为 DAG 求解。

发现对于出度为 0 的点是好找的:考虑将其他点设置成 0,对于第 $i$ 个点设置为 1,所经过的电阻数量为 0 说明 $i$ 点不存在出边。

这启发我们可以反向拓扑排序。

考虑依次枚举第 $i$ 个点查询是否存在连向 $d$ 的边,这只需要将除了 $d$ 以外已经没有出边的点以及 $i$ 号点的值全都设置为 1,考虑通过修改 $d$ 的值判定是否存在边。

记录这条边,考虑是否 $i$ 号点的所有出边已经找完,如果除去已经找出的 $i$ 与之相连的点还存在,那就不加入,这可以得到 54pts。

发现瓶颈在于查询 $d$ 的入边,考虑分治优化。

具体的,考虑处理出所有和 $d$ 有关的已经没有出边的点并通过上述处理单点的方法判断区间内是否存在点,这样复杂度优化到 $O(m \log n)$。

Tuesday(6.30)

AT_arc203_c [ARC203C] Destruction of Walls

组合数写错了,不应该啊。

下文的 $n,m$ 分别对应 $H,W$。

发现对于 $k < n + m - 2$ 答案显然是 0,考虑剩下的情况。

对于 $k = n + m - 2$,答案是显然的:

$$
\binom {n + m - 2} {n - 1}
$$

对于 $k = n + m - 1$,相当于再填一条边,但对于路径不会造成影响,考虑再加一条边的方案数即可:

$$
\binom {n + m - 2} {n - 1} \times (2 \times (n-1) \times (m-1))
$$

考虑 $k = n + m$ 的情况,先考虑和 $n + m - 1$ 时的情况一样选择两条与最后路径不相干的边,但在拐角处会重复计算贡献,考虑容斥:

$$
\binom {n + m - 2} {n - 1} \times \binom {2 \times (n-1) \times (m-1)} {2} - \binom {n + m - 4} {n - 2} \times (n + m - 3)
$$

再考虑加上两条边后组成唯一路径的合法情况:

$$
\binom {n + m - 2} {n - 3} \times (m - 1) + \binom {n + m - 2} {m - 3} \times (n - 1)
$$

总的下来就是:

$$
\binom {n + m - 2} {n - 1} \times \binom {2 \times (n-1) \times (m-1)} {2} - \binom {n + m - 4} {n - 2} \times (n + m - 3) + \binom {n + m - 2} {n - 3} \times (m - 1) + \binom {n + m - 2} {m - 3} \times (n - 1)
$$

July

Week 1

Wednesday(7.1)

P15804 [GESP202603 八级] 消息查找

为啥赛时的满级线段树伪了啊?

  • 赛时

发现对于每一个 $a_i$ 发现它所做出的贡献区间的左端点一定也是一个 $a_j$,并且发现贡献区间是严格降序的,考虑线段树 rebuild + 区间加法处理即可,再拿 set 记录 $a_j$ 即可。

复杂度 $O(n \log ^2 n)$,但只有 0pts,死因是没法处理更新的区间中的点再跳的方案。

  • 赛后

发现 $a_i > 0$ 的数量不超过 1000 个,所以总共只有 2000个特殊的点,考虑对于这 2000 个特殊点跑一遍拓扑排序,查询时记录 $\le x$ 和 $\ge y$ 的第一个点,分别计算即可。

Week 2

Monday(7.6)

P9755 [CSP-S 2023] 种树

忘前缀和了 + corner case 挂了 30pts。

发现似乎就题目而言不太好 DP,考虑二分答案。

发现对于每个二分的 $x$ 作为最晚时间点,考虑算出每个点的最晚种植时间,具体算法略。

考虑转化到树上,记录每个点最早需要覆盖这个点的时间,判断 $f_1$ 是否 $\ge 1$ 即可获得 90pts。

考虑问题出现在对于同一个时间点这个覆盖的范围只能延伸一个点,考虑将他们放入桶中记一遍前缀和,统计一下 $i$ 的前缀和是否 $\le i$ 即可。

Wednesday(7.8)

P4492 [HAOI2018] 苹果树

看错题 ++。

考虑发现对于 $i$ 这条边所做出的贡献就是 $sz_{v_i} \times (n - sz_{v_i})$,考虑定义 $f_{i,j}$ 表示对于前 $i$ 个树,子树大小为 $j$ 的子树个数的和(总体方案)。

对于 $f_{i,1}$,初始情况就要加上一个 $i!$。

对于所有点,似乎我为人人更好 DP,考虑转移:

$$
f_{i + 1,j + 1} = (j + 1) \times f_{i,j}

\

f_{i + 1,j} = (i - j) \times f_{i,j}
$$

答案就是 $\sum {i = 1} ^{n} (n - i) \times i \times f$。

September

Week 1

Tuesday(9.1)

P17307 [ICPC 2026 Xi'an I] Zebra Crossing

多测没清空。

不是,暴力能过?!

考虑找出这个点 $u$ 和它子树内第一个白点之间的距离 $dis_u$。

设 $x$ 表示目前走到 $u$ 还剩多少步,如果 $dis_u \le x$,那 $x$ 可以更新为 $\max (k - dis_u,x)$,这是显然的。

然后每次走到儿子时,如果自己目前 $x = 0$,就是我必须选择在这里停一步(这个点当然一定是黑点,是白点的话 $x$ 重置为 $k$ 了),答案加一重置 $x$ 即可。

Wednesday(9.2)

P10071 [CCO 2023] Triangle Collection

inf 个 0pts,拿不下最优解。

考虑到全是偶数的情况是好做的,考虑把奇数的点分离一个 1 出来考虑。

考虑将偶数的位置移动到它最远可以贡献的点(即 $2 \times x - 1$),对于 1 的点就放在原来的位置上。

考虑到这样做的最大匹配后留下的区间样子一定是区间前方一堆偶数位,后方一堆奇数位,二者不交。

这个可以直接拿线段树维护即可。

Thursday(9.3)

P9197 [JOI Open 2016] 摩天大楼 / Skyscraper

轮廓线 DP 板子,但我没学过。

首先按照 $a_i$ 的大小升序将数字插入原序列中,然后我们考虑对于连续段进行 DP。

记 $f_{i,j,k,l}$ 表示插入完前 $i$ 个数后,有 $j$ 个连续段,当前 $a$ 的权值为 $k$,有 $l = 0/1/2$ 个边界被连续段挨着的方案数。

接下来我们考虑如何转移,记录新的 $k$, $k' = k + (2 \times j - l) \times (a_{i+1} - a_i)$,注意,在同一个状态我们只关心连续段的相对位置,分讨可得以下转移:

  • $a_i$ 插入到某一个连续段的开头或结尾,且插入的地方不为边界,此时有转移:

$$
f_{i+1,j,k',l} = (2 \times j - l) \times f_{i,j,k,l}
$$

  • $a_i$ 插入到某一个连续段的开头或结尾,且插入的地方为边界,此时有转移:

$$
f_{i+1,j,k',l} = (2 - l) \times f_{i,j,k,l}
$$

  • $a_i$ 连接了两个连续段,此时有转移:

$$
f_{i+1,j,k',l} = (j - 1) \times f_{i,j,k,l}
$$

  • $a_i$ 独立成段,且不为边界,此时有转移:

$$
f_{i+1,j,k',l} = (j - l + 1) \times f_{i,j,k,l}
$$

  • $a_i$ 独立成段,且为边界,此时有转移:

$$
f_{i+1,j,k',l} = (2 - l) \times f_{i,j,k,l}
$$

复杂度:$O(n^2L)$。

Week 4

Saturday(9.26)

P4899 [IOI 2018] werewolf 狼人

代码能力趋近于 0。

考虑分别以边权为 $\min (u,v)$ 和 $\max (u,_v)$ 建 kruskal 重构树,这样我们只需要分别在 $\min$ 树和 $\max$ 树中分别找到包含 $s$ 和 $t$ 且点权分别 $\ge l$ 和 $\le r$ 的点的子树所包含的集合,看看集合的并集是否有值。

发现这里把两棵树拍到 dfs 序上就是两个区间,考虑是否存在区间一中出现的值在区间二中也出现了。

考虑这样一个东西咋维护。

因为这都是个排列,所以在区间一中的每个值只会在区间二中出现一次。

考虑记录这个值在区间二中出现的位置,当我访问到时在权值线段树上标记出来。

考虑到这个东西需要统计在一个范围内所改变的一段区间内的值的数量,可持久化一下即可。

October

Week 2

Monday(10.5)

P4657 [CEOI 2017] Chase

两者遇到的铁球的差可以分成两部分:逃亡者避开的铁球+逃亡者从其他路径吸引来的铁球,也就是说问题可以转化为:对于一颗树,定义一条路径的价值为路径上前 $v$ 大的点权之和,要求一条以根为起点的最大价值路径。

事实上可以强制以 $1$ 为根,规定“上”和“下”的顺序。于是就和求树的直径很类似地,合法的路径要么一条上;一条下;两条上下的组合起来。

定义 $f_{i,j,0}$ 表示从 $x$ 的子树中某个节点向上走到 $x$,最多使用了 $i$ 个节点的最大价值,$f_{i,j,1}$ 表示一条向下路径使用 $i$ 个节点的最大价值。

转移是显然的。

Tuesday(10.6)

P7707 「Wdsr-2.7」百花齐放的太阳花田

调一下思路,按原下标构建线段树,每个节点维护其对应区间在不同阈值 $x$ 下的状态,即区间内所有满足 $h_i \le x$ 的花朵,按原顺序排列后,其颜色序列的连续段信息。

由于状态仅随 x 增大而改变,且只有当 $x$ 跨越区间内某个实际的 $h_i$ 值时才会更新,因此每个节点中不同的有效状态数恰好等于该区间内不同 $h_i$ 值的种类数,至多等于区间长度。

此外,单点修改(新增一枝花)只会影响该点所在路径上的 $\log n$ 个线段树节点。所以整棵线段树的状态数总和不会超过 $n \log n$。以上是对这种做法可行的简要说明。

这样子,查询时只需递归覆盖查询区间,在每个完全覆盖的节点中二分找到阈值 x 对应的状态,再按顺序合并各节点返回的状态,即可得到答案。

Thursday(10.8)

P11095 [ROI 2021] 旅行 (Day 2)

我的 rk 1 啊。

考虑到固定 min 或 max 显然会更好做一些,发现固定 min 后是跑 kruskal 重构树,不太好优化。

考虑将所有边按边权从小到大排序,依次枚举一条边,这条边就是当前的最大值,现在只能经过在这条边之前的边。

思考加入边 $(u,v)$ 之后的影响:

  • 若 $u$ 和 $v$ 已经在一个边双里面了,则没有任何影响,因为这条边一定比已经在边双中的所有边都大;
  • 若 $u$ 和 $v$ 已经在同一树里,但不在同一个边双内,则需要把 $u$ 到 $v$ 路径上所有点缩起来,这个点的点权是路径上所有点权和边权的最小值,然后更新子树内所有点的答案;
  • $u$ 和 $v$ 不在同一个连通块内,直接把 $u$ 和 $v$ 连起来即可。

注意到第三种情况的边一定是最小生成树上的边,于是先跑出整个图的最小生成树,预处理得到每一个点的点权。

现在的问题是,某个点可能在还未与 1 连通的时候就记录了答案,因此我们需要在每个点与 1 所在连通块连接时,重新计算这个点的答案。

用两棵线段树,分别维护树上路径的最小值和实际的答案,需要支持区间取 min,单点修改和单点查询。

对于第二种情况的缩点操作可以用并查集维护,让并查集的根为连通块深度最小的点即可,复杂度是均摊的,总复杂度 $O((n + m) \log n)$。

Friday(10.9)

P4785 [BalticOI 2016] 交换 (Day2)

发现可以根据 $2 \times i + 1$ 和 $2 \times i$ 发现可以建一颗二叉树来维护。

然后我们考虑维护每一个位置可以取到的数(在不影响前面已经选完的那些的情况下),我们只要贪心地按编号依次在它们能取到的数中选择最小的那一个就可以得到答案。

对于上面这个操作,我们先考虑一个位置可以取到的数在没有任何别的限制的情况下有多少个。我们发现一个结点能取到的数实际上包括这些:

  1. 这个结点的两个儿子
  2. 这个结点到根结点的路径上的所有点以及这些点的左儿子(如果这些左儿子原来不在序列里的话)

我们发现,一个结点能取到的所有点的个数是 $\log n$ 这个数量级的,因此对于每个结点找出它能取到的最小值,总复杂度是 $O(n \log n)$。

因此我们剩下来的任务就是判断对于一个结点来说,哪些点是可以取的,哪些是不能取的。

我们把一个结点分成三类:

  1. 取值不来自于它的后代
  2. 取值来自于它的左儿子
  3. 取值来自于它的右儿子

我们发现,对于第一类结点,它上面的点(包括它自己,下同)是不会换到它的下面的,它的左儿子也不可能到它的右子树上;对于第二类结点,它上面的点只有一个可以换到它的左子树上,并且它的左儿子也不会到右子树上。对于第三类结点,它上面的点只有一个可以到它的左子树或者右子树上(相对应的,它的左儿子可以到另一边去)。

因此,我们只需要在每一个点上维护一些信息,就可以实现前面说的功能。具体来说,我们需要记录每一个点是第几类点(如果这个点还没有选就是 0),然后对于第二类点和第三类点记录它们是否被用过,对于第三类点还需要记录它将左儿子放到了左边还是右边。

Sonday(10.12)

P3826 [NOI2017] 蔬菜

模拟费用流是个啥子东东,没学过,只会贪心。

考虑到如果我知道 $f_{i + 1}$ 的答案和构造方案,那只需把最小的几个超出限制的菜给扔掉就可以了,现在相当于是求 $f_{inf}$ 的值和方案数。

考虑到可以用一种时间回溯的思想,这样可以视作在不断运菜,这样的贪心策略是显然的,只需每次选取最大的几个数。

我们发现这个思路和原题是等价的。

这样只需记录最后一个出现的位置倒着处理即可。

如果 T 了,只需要单独处理一下 $x_i = 0$ 的情况的点即可。

posted @ 2026-01-22 15:09  Ptll  阅读(35)  评论(0)    收藏  举报