山东五一集训2026
想不到吧,一年前的今天我就在这里,一年后的今天我还在这里。
Day 1
-
P1438 无聊的数列。
简单题。
我们注意到差分是再求前缀和是原数组。所以,我们在线段树树状数组上维护差分数组 \(d_i = a_i - a_{i - 1}\),然后对于每次 \([l, r]\) 进行修改即可。然后在 \(r + 1\) 的位置上再减掉 \(D \times (r - l) + K\) 即可。 -
P2023 [AHOI2009] 维护序列。
板子题。
简单,我们直接把懒标记拆成两个,一个乘法,一个加法。考虑乘法对于加法的优先级,然后随便拆拆就行了。 -
CF438D The Child and Sequence。
势能分析。
我们考虑对于任意一个 \(x > p\),一定有 \(x \equiv y \pmod p\),且 \(0 \le y \le p - 1\),则定有 \(y \times 2 \le x\)。
所以,每一个 \(x\) 至多经历 \(\log x\) 次数就会变成 \(0\)。
我们考虑势能分析,单点至多赋值 \(m\) 次,所以总的时间复杂度就是 \(O((n + m) \log V)\)。 -
CF61E Enemy is weak。
简单题。
直接考虑中间的点,考虑前面多少个严格大于 \(a_i\),后面多少个严格小于 \(a_i\),再乘在一起再相加即可。 -
CF935F Fafa and Array。
我们考虑,对于我们把 \(pos\) 这个位置的值加上 \(x\),会产生的贡献是 \(2 \times (x - \max(-d_{p - 1}, 0) - \max(d_p, 0))\)。下面的思路比较显然了,我们令 \(g_p = \max(-d_{p - 1}, 0) + \max(d_p, 0)\),我们使用线段树维护这个区间的 \(\min\),然后对于 corne cases 直接处理即可。 -
CF1527E Partition Game。
考虑DP。
设 \(f_{i, j}\) 表示前 \(i\) 个数字恰好分成 \(j\) 组,那么我们轻松列出转移方程:
\(f_{i, j} = \min f_{k - 1, j - 1} + w_{k, j}\)
其中,\(w_{i, j}\) 定义为 \([a_i, a_{i + 1}, ..., a_{j - 1}, a_j]\) 的 \(cost\) 值。
接下来考虑如何计算 \(w\) 值。很明显,如果 \([i, j - 1]\) 中存在一个 \(a_k = a_j\),那么 \(w_{i, j} = w_{i, j - 1} + j - lst_{a_j}\),其中 \(lst_{a_j}\) 表示 \(a_j\) 最后一次出现的位置;否则,\(w_{i, j} = w_{i, j - 1}\)。这样我们得到了一个复杂度为 \(O(n^2k)\) 的做法。
考虑线段树优化。我们令线段树的 \(st_k = f_k + w_{k + 1, i}\),我们可以发现,如果 \(k + 1 \le lst_i\) 的话,则 \(a_i\) 并非首次出现,所以我们这时候可以统计上代价。所以,我们对于区间在 \([1, lst_{a_i}]\) 中的每一个元素加上代价为 \(i + 1 - lst_{a_i}\) 即可。复杂度为 \(O(nk\log n)\)。 -
CF833B The Bakery。
我们容易发现,这个题和上面那个题的解法大致一致。
我们状态设的一样,然后我们考虑,对于 \(lst_i \le p\) 的所有位置,这个的数字个数会加上一,所以我们只需要改一下上面的修改的地方就可以了。还是非常相似的。 -
CF813E Army Creation。
我们使用瞪眼大法,令 \(bad_i\) 表示从 \(i\) 向前数 \(k\) 个的位置。特别地,如果没有这么多,那么我们令 \(bad_i = 0\)。
接下来,我们直观的发现,我们只需要令在区间 \([l, r]\) 之间的所有同一个值的元素的前 \(k\) 个的权值为 \(1\),剩下的是 \(0\)。注意到,这个条件等价于 \(bad_i < l\),所以我们的统计问题就是在 \([l, r]\) 之间 \(bad_i < l\) 的个数。考虑主席树优化即可。 -
CF893F Subtree Minimum Query。
我们考虑直接做的话不会很好做,所以我们考虑再 DFS序 上面做。
我们考虑,对于所有在 \(x\) 的子树中,定存在 \(dfn_x \le dfn_y \le dfn_x + size_x - 1\),而且我们要找出 \(dep_y \le dep_x + k\)。所以,我们用 dfn 建立可持久化线段树,然后支持区间查询即可。
Day 2
-
P3384 【模板】重链剖分 / 树链剖分。
板子题。
简单题。我们考虑使用树链剖分,维护 DFS 序,每次考虑对于节点 \(u\) 和节点 \(v\),每次找 \(u\) 和 \(v\) 的链首节点,即 \(top_u\) 和 \(top_v\),然后根据 DFS 序进行修改即可。时间复杂度 \(O(n \log^2 n)\)。 -
P3401 洛谷树。
好题,经典的树上 DS。
我们首先考虑,对于边权我们貌似不是很好搞,所以我们把边权下放给点权。形式化的,令 \(val_u\) 为从 \(1\) 号节点到 \(u\) 节点所有路径异或和。
接下来,我们充分发扬人类智慧,发现所有子路径异或和本质上和所有路径上任意两点的异或和之和没有本质性差别,所以这个问题转化成了求路径上所有任意两点的异或之和。
接下来,我们接着发扬人类智慧,注意到这个边权 \(w \le 2^{10} - 1\),所以我们拆位进行计算。考虑使用 \(10\) 个线段树。注意到 \(1 \oplus 0 = 1\),所以我们直接计算在区间上 \([l, r]\) 中 \(0\) 和 \(1\) 的个数再乘以这一位的贡献即可。形式化的,我们设有 \(a\) 个 \(0\),\(b\) 个 \(1\),现在这一位是 \(k\),那么答案就是 \(a \times b \times 2^k\),然会求和。
对于修改操作,我们考虑修改这个点所在的子树进行修改即可。时间复杂度是 \(O(n \log n + q \log n \log V)\)。 -
P2486 [SDOI2011] 染色。
比较裸。
我们考虑如何在序列上进行操作。其实,这还是挺简单的。我们考虑线段树的 \(tag\) 表示这一段是否被染上颜色。然后 \(sum\) 可以通过以下计算式表示:
然后考虑推广到树上即可。
-
P5903 【模板】树上 K 级祖先。
考虑长链剖分。
我们先求出倍增数组,对于 \(u\) 计算出 \(anc_{u, j}\),然后我们发现 \(k - 2^j\) 还需要走。接下来,跟据长链剖分,我们知道,\(k - 2^j < 2^j\),所以我们直接记录对于每一个链顶进行预处理向上 \(d\) 和向下 \(d\) 步所在的点。这样就可以实现了。 -
P4551 最长异或路径。
简单题。我们直接考虑树上的前缀异或和,然后放在 Trie 树里面算就行。 -
P5283 [十二省联考 2019] 异或粽子。
首先,我们先求出疑惑前缀和,并且建立 Trie 树。对于异或前缀和 \(val_r \oplus val_{l - 1} = cost_{l, r}\),所以我们对于任意的 \(i\) 从 \([0, n]\) 中选择出最大的放在堆里面。因为 \(k\) 并不大,只有 \(2 \times 10^5\),所以我们每次直接取出对头即可。复杂度 \(O(k \log n)\)。
Day 3
mwr:状压 DP 就是一种 DP。
- P1433 吃奶酪。
简单题。
我们设 \(f_{S, i}\) 表示以 \(i\) 为结尾、集合为 \(S\) 的最大价值。下面我们轻松得出状态转移方程:
其中,满足 \(2^k \in S\),答案是 \(\min f_{2^n - 1, i}\)。
-
P2396 yyy loves Maths VII。
清新小状压。
注意到跳跃的过程与 \(S\) 内元素的顺序无关。我们设 \(f_S\) 表示集合 \(S\) 的总方案数,设 \(g_S\) 表示集合 \(S\) 当前所在的位置。考虑转移:
我们钦定 \(p = lowbit(S)\),则定存在 \(g_S = g_{S \oplus p} + g_p\),正确性显然。
然后,如果 \(g_S\) 为“厄运数字”的话,我们就 continue 掉;
否则,我们发现 \(f_S = \sum_{2^i \in S} f_{S \oplus 2^i}\)
但是我们直接枚举对于任意一个 \(i \in [1, n]\) 的话复杂度是 \(O(2^nn)\),有点悬,所以我们考虑优化:这是一个经典的优化。我们每次取出 \(lowbit(t)\),这样使得我们直接跳过一些没有用的 \(i\)。 -
P1879 [USACO06NOV] Corn Fields G。
简单题。
我们设 \(f_{i, S}\) 表示第 \(i\) 行状态为 \(S\) 的答案。很明显,我们需要判断一下几个条件:
- \(S\) 中没有相邻的元素;
- \(S\) 中的所有元素全部合法。
对于第一个条件,我们轻松得到 \(S\) 和 \(S << 1\) 以及 \(S\) 和 \(S >> 1\) 的按位与结果必须是 \(1\)。正确性显然。对于条件二,我们可以记录一个数组 \(s\)(也是二进制下的)表示第 \(i\) 行的状态。显然 \(S\) 和 \(s_i\) 按位与必须是 \(S\)。
下面,我们美剧上一行的元素 \(T\),\(T\) 的判断条件如上。同时,为了满足 \(S\) 和 \(T\) 的关系,必须要求 \(S\) 和 \(T\) 的按位与的值为 \(0\)。
对于所有满足了上述条件的 \(S\) 和 \(T\),我们直接列出状态转移方程:
-
P3226 [HNOI2012] 集合选数。
神仙题啊(虽然这个题是我自己找的)。
我们考虑构造矩阵:
现在,我们在一个位置放置 \(x\),那么在它的右边放上 \(2x\),在它的下面放上 \(3x\)。然后,我们对于这个矩阵,注意到如果选了 \(x\),一定不能选它上面的,不能选它左边的,不能选它下面的,不能选它右面的,简称:在这个五格中只能选 \(x\)。
下面,我们开始充分发扬人类智慧:
注意到长和宽都不会超过 \(\log n\),所以这个东西是 \(O(\log^2 n)\) 的复杂度的,而且 \(n \le 10^5\),所以跟据上面那个题的做法,每次就可以算出在这个矩阵内部里面的答案。然后,我们跟据乘法原理可知,最后的答案是所有数字相乘即可。 -
P1896 [SCOI2005] 互不侵犯。
和上上题几乎一致。不再赘述。
mwr:反正就是这六个字的重排,具体叫啥我忘了
wxh:说人话
mwr:这个水很深啊
-
这是一道数学题:
现在有一个四面的骰子,每个面上的值是 \(1\) 到 \(4\),且:\(P(A = i) = \frac{i}{10}\)。
求:
(1) \(E(x_1^2)\)
(2) \(E(x_1 x_2)\)
(3) \(E(X)\)
(4) \(E(X^2)\)
解:
(1) \(E(x_1^2) = \sum_{i = 1}^{4} x_i^2 \times p_i\)
(2) \(E(x_1 x_2) = E(x_1)E(x_2)\)
(3) \(E(X) = n \times E(x_1)\)
(4) \(E(X^2) = \sum_{1 \le i, j \le n} E(x_i)E(x_j) = \sum_{i = 1}^{n} E(x_i) + \sum_{1 \le i, j \le n, i \ne j} E(x_i)E(x_j) = n \times E(x_1^2) + n \times E(x_1 x_2)\) -
P1297 [国家集训队] 单选错位。
简单题。
我们注意到,答案一定是 \(\sum \frac{1}{\max (a_i, a_{i + 1})}\)。
注意保留小数。 -
P2719 搞笑世界杯。
设计状态。我们设 \(f_{i, j}\) 表示剩余 \(i\) 张 A 类票和 \(j\) 张 B 类票的概率。
很明显,对于所有的 \(i > 1\) 且 \(j = 0\),定有 \(f_{i, j} = 1\);
同理,对于所有的 \(i = 0\) 且 \(j > 1\) 定有 \(f_{i, j} = 1\)。
则,对于剩下的,定有 \(f_{i, j} = \frac{1}{2}f_{i - 1, j} + \frac{1}{2}f_{i, j - 1}\)。 -
P4316 绿豆蛙的归宿。
板板题。
考虑对于图建反图,考虑 DP。以下的路径默认为反图。
设 \(f_u\) 表示从 \(n\) 走到 \(u\) 的期望。很明显,我们假设 \(v\) 有 \(val_v\) 的出边,我们可以轻松算出 \(f_v = \sum\frac{f_u + w}{val_v}\) 的转移方程。 -
P1365 WJMZBMR打osu! / Easy。
我们设 \(len_i\) 表示连续长度段的期望,\(ans_i\) 表示答案的期望,\(p_i\) 为这一位可以接上的概率。直接转移:\(len_i = p_i \times (len_{i - 1} + 1)\) 和 \(ans_i = p_i \times (ans_{i - 1} + len_i)\)。 -
这是一道数学题。
假设在数轴上,你现在处在原点。你现在有 \(p\) 的概率向右走(\(p > \frac{1}{2}\)),有 \(1 - p\) 的概率向左走。求:你走到 \(n\) 的期望步数。
解:
首先我们设 \(a\) 表示从原点第一次走到 \(1\) 的期望。
我们可以知道,直接向 \(1\) 走了一步,期望为 \(p\);
向左走一步,再向右走两步,期望值是 \((1 - p) \times 2a\)
则我们可以列出方程:
解得 \(a = \frac{1}{2p - 1}\)
跟据期望的线性性,我们可以算出 \(E(n) = n \times E(1)\),所以期望值是 \(\frac{n}{2p - 1}\)。
证毕。
Day 4
最后一天啦~
-
P2679 [NOIP 2015 提高组] 子串。
设 \(f_{i, j, k, 0/1}\) 表示前 \(i\) 个 \(A\) 串、前 \(j\) 个 \(B\) 串、现有 \(k\) 段,第 \(i\) 位是否选择。很容易得到 \(f_{i, j, k, 0} = f_{i - 1, j, k, 0} + f_{i - 1, j, k, 1}\)。
如果存在 \(A_i = B_j\),则 \(f_{i, j, k, 1} = f_{i - 1, j - 1, k, 1} + f_{i - 1, j - 1, k - 1, 0} + f_{i - 1, j - 1, k - 1, 1}\)。
注意到这样的空间复杂度不可以接受,所以我们考虑优化:很简单,使用滚动数组可以优化掉 \(i\) 这一位维。 -
P3572 [POI 2014] PTA-Little Bird。
设 \(f_i\) 表示答案。注意到转移式子:\(f_i = \min f_j + [d_j \le d_i]\)。但是后面的表达式没有办法直接展开。注意到 \([d_j \le d_i] \le 1\),所以当且仅当 \(f_{j1} < f_{j2}\),顶存在 \(f_{j1} + [d_{j1} \le d_{i}] \le f_{j2} + [d_{j2} \le d_i]\),也就是说贡献严格小则一定不劣,单调队列维护 \(f_i\) 和 \(d_i\) 即可。 -
P3957 [NOIP 2017 普及组] 跳房子。
略有点难度,但不大。
先二分 \(g\),然后在 check 函数里面进行 check,使用 DP,考虑 \(f_i\) 表示答案然后进行转移。如果可以的话,那么返回可行性。 -
P2254 [NOI2005] 瑰丽华尔兹。
好题,不愧是 20 年前 NOI 好题。
我们首先设计状态:\(f_{t, x, y}\) 表示在第 \(t\) 时刻所处在的位置是 \((x, y)\) 的最长滑动距离。很明显,我们存在转移:\(f_{t, x, y} = \max(f_{t - 1, x, y}, f_{t - 1, x', y'} + 1)\),其中 \(x'\) 和 \(y'\) 表示上一次的位置。
注意到这个时间复杂度是不优的,考虑优化。
注意到在一定时间内它的移动方向是一定的,所以说距离起始位置的距离也是一定的,所以我们设 \(f_{i}\) 表示在这个方向上移动 \(i\) 个时间所处的位置的答案,其实我们在最后的代码中其实还是定义为 \(f_{x, y}\),这里为了方便解释先这么用。
那么,我们得到转移方程:\(f_i = \max f_j + i - j\),\(i - j\) 是移动的距离。然后,我们把 \(f_j - j\) 放入单调队列中进行优化即可。复杂度 \(O((n + m)k)\)。 -
P1613 跑路。
简单题。我们设 \(f_{u, v, k}\) 表示从 \(u\) 到 \(v\) 能否走 \(2^k\) 步。接下来,转移很简单 \(f_{u, v, k} = f_{u, a, k - 1} \& f_{a, v, k - 1}\)。如果存在,那么 \(dis_{u, v} = 1\)。然后再在新图上做 Floyd 即可。复杂度 \(O(n^3 \log n)\)。
mwr:大家可以把矩阵当成一个......
我:二维数组。
mwr:二维数组。
- P2579 [ZJOI2005] 沼泽鳄鱼。
好题,不愧是 20 年前的浙江省选题。
浙公网安备 33010602011771号