好题合集 2026.10

序

怎么十月了?

感觉所有题都写进去没啥意思,就记一点有意思的题。

Problems

P5355 Ynoi Easy Round 2017 由乃的玉米田 *Purple /

详见 Data Structures。

P5607 Ynoi2013 无力回天 NOI2017 *Purple $

详见 Data Structures。

P3580 POI 2014 ZAL-Freight

模拟赛 T2。

首先有结论,一段车子肯定是一起过去一起回来,证明的话就是过去的火车回来肯定会阻挡一部分车,这至少 \(1\) 分钟,但是一起过去不会被阻挡,最多因为发车被拖 \(1\) 分钟,所以这是对的。

先对所有的 \(t_i\) 处理一下,即依次对 \(2 \le i \le n\) 执行 \(t_i\gets \max(t_{i-1}+1,t_i)\)。

这样可以得到一个 \(O(n^2)\) 的 dp,记 \(f_i\) 表示前 \(i\) 辆车的最小时间,考虑一段区间 \(j,i\),即对所有 \(\max(t_i,f_j+i-j-1)+2s+i-j-1\) 取 \(\min\),考虑这个 dp 有何性质。

我们有 \(f_{i-1}+2\le f_i\),感性理解就是一辆车过去回来至少两分钟,然后维护最大的 \(k\) 使得 \(f_k+i-k-1\le t_i\),\(0,k\) 的部分显然取 \(k\) 决策,因为此时 \(i-k+1\) 最小。\((k,i)\) 的部分注意到等价于求 \(f_j-2j\) 的最小值,由于 \(f_{i-1}+2 \le f_i\),所以肯定取 \(k+1\) 进行决策,时间复杂度 \(O(n)\)。

P3426 POI 2005 SZA-Template

波兰人还在发力。

首先有一个比较明显的结论,印章 \(t\) 一定是串 \(s\) 的一个 border,因为你要覆盖前缀也要覆盖后缀。先做一遍 kmp 求出 \(s1 \\sim i\) 的最长 border 长度 \(p_i\),考虑 dp 求出 \(s1 \\sim i\) 的答案。

首先 \(f_i\) 可以为 \(i\),整个串显然是合法的。我们又有长度为 \(f_i\) 的串可以覆盖 \(s1 \\sim p_i\),因为你肯定要覆盖掉 \(s1 \\sim p_i\)。

如果两个不同长度的印章 \(a<b\) 都能印出同一个串,那么较短的 \(a\) 能够印出较长的 \(b\),于是我们得到 \(f_i\) 只能从 \(f_{p_i}\) 转移过来,但是也有一定的限制,我们显然要找到一个最大的 \(q\) 使得 \(f_q=p_i\),并且为了全部覆盖,要求 \(q+p_i \ge i\),答案就是 \(f_n\)。

P1852 国家集训队 跳跳棋

好题。

考虑状态 \((x,y,z)\) 其中 \(x<y<z\) 下一步能变成什么,一种是向外面可以变成 \((2x-y,x,z)\) 和 \((x,z,2z-y)\),还有一种是向内。

但是一次只能跳过一个,记 \(d_1=y-x\),\(d_2=z-y\),若:

  • \(d_1<d_2\),可以变成 \((y,2y-x,z)\)。
  • \(d_1>d_2\),可以变成 \((x,2y-z,y)\)。
  • \(d_1=d_2\),无法进行。

将所有互相可达状态连边,发现这是一个二叉树的形式,一棵树的根就是 \(d_1=d_2\) 的点,父亲就是向内跳的状态。此时相当于要求树上两点距离,LCA 的话可以倍增处理,深度可以用类似辗转相除的方式计算,代码懒得写。

P4786 BalkanOI 2018 Election

完蛋了,啥都不会做。

三倍经验 P8304,P12547。

首先 \(\texttt{T} \to -1\),\(\texttt{C}\to 1\),做一遍前缀和得 \(s\),考虑如何 \(O(n)\) 求出这个答案。从前往后扫一遍,出现 \(<0\) 就把这个 \(-1\) 扔了,再倒着做一遍,贪心得到最优解。

考虑快速求这个删除次数,显然第一次删除次数一定是 \(\max\{ -p_i\}\),但是正着会对倒着做的东西产生影响,我们有 \(s_i=p_n-p_{i-1}+\max\{ -p_i\}-\max\limits_{j < i}\{ -p_i\}\),加起来拆一下就是 \(\min \limits_{1 \le i<j \le n} \{s_i+p_j\}\),相当于是不交前后缀最小值,相当于求最大值,线段树维护即可。

P9990 Ynoi Easy Round 2023 TEST_90

详见 Data Structures。

CF1521D Nastia Plays with a Tree

考虑 dp,记 \(f_{u,0/1}\) 表示点 \(u\) 的父边是否保留下,子树内最多保留多少边,转移直接根据存在边数 \(\le 2\) 的条件去转移,构造方案有点史,dp 的时候记录一下即可。

CF1485F Copy or Prefix Sum

很有意思。

把条件转化到 \(a_i\) 上,有 \(a_i\gets b_i\) 或 \(a_i\gets b_i-\sum \limits_{j<i} a_j\),所以当且仅当 \(\sum \limits_{j<i} a_j=0\) 会重复计算。

考虑 dp 数这个东西,记 \(f_i\) 表示前 \(i\) 个数的答案,辅助计算 \(g_i\) 表示前 \(i\) 个数和为 \(0\) 的方案数,有 \(f_i=2f_{i-1}-g_{i-1}\),考虑如何计算 \(g_i\)。

不难想到枚举上一个将 \(a_i\) 表示为第二种方式的 \(k\),此时 \(k+1,i\) 都用的第一种,则前 \(k\) 个和为 \(b_k\),剩下的分别是 \(b_{k+1},b_{k+2},\ldots,b_i\),此时加起来就是 \(b\) 的一个后缀和,前缀和表示成 \(s_i=s_{k-1}\) 时合法,显然这种情况的方案数为 \(f_{k-1}\)。

对于两个同时合法的位置 \(p,q\),考虑两者之间是否存在影响,此时我们知道 \(1 \sim p\) 的和为 \(0\),那么 \(p+1,q\) 之间怎么填都是相同的,所以只需要算最近的那个符合的就行,用 map 维护做到 \(O(n\log n)\)。

P17024 ROI 2026 Day2 火星背包

怎么和泰莫利亚的调查是同一轮?但是不会。

首先二进制贪心比较显然。一开始想着维护一个 Trie,但是根本做不动。

考虑分治,显然答案具有单调性,也就是说我们确定一个区间的前几位一致的化,剩下的形式一定是 \(1,1,\ldots,1,0,0,\ldots,0\),记当前考虑第 \(p\) 位,区间是 \(l,r\),状态是 \(s\),为了方便我们对于 \(p\) 位以下的全部填 \(1\)。

考虑第 \(p\) 位不是 \(0\),令 \(f_i(S)=\sum \limits_{j \le i \land w_j \subseteq S} v_j\),我们希望找到一个最小的 \(j\) 使得 \(f_j(S) \ge C\)。

\(f\) 可以快速从 \(i\) 推出 \(i+1\),于是我们预处理 \(f_{l-1}(S)\),再维护 \(g_{p,T}\) 表示 \(p\) 位以上的且 \(0 \sim p\) 位为 \(T\) 的 \(v_i\) 之和,这个可以每次递归分治的时候提前计算出来,于是 \(f_{l-1}(S)=\sum g_{p,T}\),\(p=-1\) 的时候把 \(l \sim r\) 赋成当前状态即可,时间复杂度 \(O(nk+k2^k)\)。

Universal Cup 10.9

Contest

全队 \(7\) 题。

打星是赛后补的。

B. Valid Assignment

未能做出签到,我是小猪。/bx ljd。

首先有奇环无解,于是黑白染色,显然 \(0\) 的位置颜色相同,且 \(0\) 的位置确定其他值也都确定,每种颜色有 \(2^c-1\) 种,相加即可。

C. Reconstruction

罚了 \(2\) 发,成为小猪。

记原运算是 \(x \oplus y\),转化运算发现模 \(3\) 意义下 \(x \oplus y=-(x+y)\),组合数计算一下即可,使用卢卡斯定理。

D. Penalties on a Segment of Cities

线段树优化 dp 经典题。

记 \(f_i\) 表示考虑 \(1 \sim i\) 和所有 \(r \le i\) 的区间的最小答案,枚举上一个 \(0/1\) 的位置 \(j\),有 \(f_i=\min \{f_{j-1}+\text{cost}(j,i,0/1) \}\)。\(\text{cost}(l,r,0/1)\) 表示区间 \(l,r\) 全部填 \(0/1\) 导致所有 \(r \le i\) 的罚款总和,这个可以将每个限制放在右端点然后线段树维护,时间复杂度 \(O(n\log n)\)。

E. Orientation of a Graph

妙妙构造,/bx tw。

J. Minimum Spanning Forest *

详见 Data Structures。

K. Three Permutations

难绷之题。

先计算出不交换 \(c\) 时的 \(d\),发现交换 \(c_i,c_j\) 等价于交换 \(d_i,d_j\),于是变成给定排列 \(A,B\),求最小交换次数使得 \(\sum \limits_{i=1}^n A_i=B_i=k\),对 \(k=0,1,\ldots,n\) 求解。

\(k=n-1\) 显然无解,下面不讨论。

连置换环,\(k\) 显然为环大小为 \(1\) 的个数,记原来有 \(g\) 个位置相等。

\(k\le g\) 是容易的,每次把两个大小为 \(1\) 的合并成大小为 \(2\) 的,一次少 \(2\),最后一个如果是奇数就单独连,答案是 \(\lceil \frac{g-k}{2} \rceil\)。

\(k>g\) 我们考虑交换在置换环的表现形式,我们发现大小 \(x+y\) 的环操作一次可以分裂成大小为 \(x\) 和 \(y\) 的两个环,也就是说对于一个大小为 \(r\) 的环,前 \(r-2\) 次可以分裂出一个大小为 \(1\) 的环,最后一次可以直接分裂出两个。按照环大小排序贪心的取。

但是存在一个 Corner Case,就是如果环大小全是 \(2\) 且增量是奇数,那么我们只能额外使用两次操作分裂再合并出来一个环,然后就做完了。

L. Graph Built by XOR

更加难绷之题,/bx ljd。

结论:路径长度最多是 \(4\) 否则不优,证明按位贪,使用 Trie 维护即可。

M. Board Game

二次剩余博弈题,/bx ljd。

AT_agc002_f Leftmost Ball

简单数数。

题目等价于求出 \(n\) 个白球颜色为 \(1\sim n\) 的每种各 \(k-1\) 个的有色球,要求每一个前缀白球数量大于颜色数量。

显然 dp 做这个事情,令 \(f_{i,j}\) 表示考虑 \(i\) 个白球和 \(j\) 个颜色的方案数,每次找到从左往右第一个空位填上。

  • 填入白球:\(f_{i,j}\gets f_{i-1,j}\)。
  • 填入有色球:此时有 \(nk-i-(j-1)(k-1)-1\) 个空位,要放 \(k-2\) 个,组合数计算。

答案就是 \(n!f_{n,n}\),时间复杂度 \(O(n^2)\)。

P12563 UTS 2024 Remove Node

首先我们有贪心策略,每次找出全局权值最大的点 \(u\),然后找出权值最大得相邻点 \(v\),然后产生贡献 \(a_u-a_v\),因为点权值一定不变小,所以越靠后合并贡献越大,这是不优的。

将贡献 \(a_u-a_v\) 看成以下形式,我们将 \(a_u\) 的权值一步步变成 \(a_u-1,a_u-2,\ldots,a_v\),每次的代价为 \(1\)。

我们按照权值一步步往下做,记当前为 \(k\),那么所有权值 \(\ge k\) 的为 A 类,剩下的是 B 类,显然同类合并是不会产生任何贡献的,异类合并有 \(1\) 的贡献。

根据贪心策略,我们会把所有 A 类合并成一个连通块再去和 B 类的合并,所以贡献是连通块个数。记 \(m\) 是点权最小值,显然如果全是 A 类没贡献。

对于任意一个点 \(u\),在第 \(m+1,m+2,\ldots,a_u\) 层中各贡献一次,对于任意一条边的权值较小的权值 \(p\),在 \(m+1,m+2,\ldots,p\) 层中被抵消,全部相加得 \(\sum (a_u-m)-\sum \limits_{(u,v) \in G} \min(a_u,a_v)-m=\sum a_u-\sum \limits_{(u,v) \in G} \min(a_u,a_v)-m\),剩下的数据结构优化即可。

AT_agc006_c Rabbit Exercise

考虑 \(f_i\) 表示第 \(i\) 个点的期望位置,最暴力的有 \(f_i=f_{i-1}+f_{i+1}-f_i\)。

考虑每个三元组 \((x,y,z)\),每次变换写成相邻做差的形式就是 \((x,y-x,z-y)\to (x,z-y,y-x)\),相当于交换 \(f_i-f_{i-1}\),做置换上的快速幂即可。

AT_agc018_c Coins

先钦定全选 A,然后 A 改成 B 有 \(d_i=b_i-a_i\) 的收益,A 改成 C 有 \(e_i=c_i-a_i\) 的收益。

考虑 \(i\) 选 \(e\) 且 \(j\) 选 \(d\) 的情况下,交换一下会更优的条件,有 \(e_i+d_j < d_i+e_j\),得 \(e_i-d_i<e_j-d_j\),于是按照 \(e-d\) 单调不降排序,此时最优策略一定是在前 \(k\) 个取一定的 B,后 \(n-k\) 个取一定的 C 组成,优先队列维护即可。

P5397 Ynoi2018 天降之物

详见 Data Structures。

P5064 Ynoi Easy Round 2014 等这场战争结束之后

详见 Data Structures。

CF1178F2 Long Colorful Strip

考虑 F1 的做法,\(n=500\) 提示我们区间 dp,记满足区间 \(l,r\) 的方案数。

我们找出这个最小值位置 \(x\),并枚举覆盖这个最小值的区间 \(L,R\),因为覆盖数的时候要求区间内颜色数一致,所以此时的方案数为 \(f_{l,L-1}f_{L,x-1}f_{x+1,R}f_{R+1,r}\),记 \(i>j\) 的所有 \(f_{i,j}=1\),预处理做到 \(O(n^3)\)。

F2 此时 \(m\) 是 \(10^6\) 级别,但是每次覆盖只会多两个颜色段,先把相同颜色的缩在一起得真正的 \(a\),\(m>2n\) 方案数就是 \(0\)。若颜色 \(j\) 内出现颜色 \(i(i<j)\) 也无解。

沿用 F1 的做法,但是区间最小值可能有多个,所以分开乘起来,同样预处理做到 \(O(n^3+m)\)。

CF1909F2 Small Permutation Problem

不会 *2200,这训了个滚木。

考虑 F1,对 \(a\) 进行差分得 \(b\),\(b_i\) 的实际意义是 \(\max(j,p_j)=i\) 的不同 \(j\) 个数,显然若 \(b_i \notin \{0,1,2\}\) 无解。

然后对 \(b_i\) 分类讨论一下,维护 \(c\) 表示前面没选的数即可。

F2 的话对于每一个 \(a_i\ne -1\) 的位置找出上一个 \(a_j\ne -1\),对 \(j+1,i\) 整段处理。将 \((i,p_i)\) 看成一个点放到二维平面上,此时相当于要解决在一个 \(x \times x\) 去掉左下角 \(y \times y\) 的部分后,放 \(t\) 个互不攻击的车的方案数,容斥解决做到 \(O(n)\)。

CF1562E Rescue Niwen!

看错题了。/kk

首先我们知道 \(si \\sim j < si \\sim j+1\),考虑 \(f_i\) 表示选取以 \(i\) 开头的一部分子串,考虑什么情况下可以从 \(i\) 转移到 \(j\)。

我们记 \(g_{i,j}\) 表示最小的 \(k\) 使得 \(s_{i+k}\ne s_{j+k}\),那么要求 \(j+g_{i,j} \le n\) 且 \(s_{i+g_{i,j}}<s_{j+g_{i,j}}\),此时 \(j\) 为开头的,\(sj \\sim p(j+g_{i,j} \le p \le n)\) 都可以取,于是有 \(f_i=\max(n-i+1,\max \limits_{j<i} \{f_j+n-i-g_{i,j}+1\})\),\(g_{i,j}\) 等价于 \(si\\sim n\) 和 \(sj\\sim n\) 的 LCP,预处理出来即可。

P8321 『JROI-4』沈阳大街 2

经典题。

将 \(A,B\) 混在一起从小到大排序,相当于我们要把 \(n\) 个 \(A_i\) 和 \(n\) 个 \(B_i\) 两两匹配,后匹配的那个数就可以加入贡献。

记 \(f_{i,s}\) 表示前 \(i\) 个数产生了 \(s\) 个对,此时未匹配的 \(A_i\) 个数和未匹配的 \(B_i\) 个数可以根据 \(s\) 求出,转移就分匹配和不匹配两种,这个是容易的,时间复杂度 \(O(n^2)\)。

P14465 霞む夏の灯(ending)

吃到史了。

首先 \(p_i \ne -1\) 的位置可以直接拿出去。把剩下的从大到小排序,沿用 P8321 的做法。

注意到 \(m \le 6\),所以可以记录 \([a_i,a_i+m)\) 的出现情况,由于是个排列可以直接状压,然后枚举是 \(<m\) 的具体某个位置匹配还是和 \(\ge m\) 的匹配即可,时间复杂度 \(O(n^2m 4^m)\)。

CF1295F Good Contest

首先有 \(f_{i,j}\) 表示考虑前 \(i\) 个数 \(a_i=j\) 的方案数的暴力 dp,转移就是后缀和的形式,将所有区间写成 \([l_i,r_i)\) 的形式离散化掉即可,前缀和优化做到 \(O(n^3)\)。

P9598 JOI Open 2018 山体滑坡 / Collapse

详见 Data Structures。

P7447 Ynoi2007 rgxsxrs

详见 Data Structures。

P9069 Ynoi Easy Round 2022 堕天作战 TEST_98

详见 Data Structures。