8.6~8.19 MX-WF-C 集训
8.6 模拟赛
盖世计划--C班--潍坊营--8月6日 - 比赛 - 梦熊联盟 (mna.wang)
盖世计划--C班--潍坊营--8月6日【订正】 - 比赛 - 梦熊联盟 (mna.wang)
太久没打真实的模拟赛了,今天有些不适应【】
时间是 8.6 的 8:00~12:00,时间分配出了大问题。主要问题是 T3 的 5k 线段树调起来困难无比。最后也没调完。导致暴力分少了 100 多【】
赛后发现挂的地方是一个局部变量没赋初值【】
A 线段
一开始没看懂题。过了很长时间后看懂了一点,觉得 \(n \le 5\) 的 dfs 很快就能写完就没管这题。此时正在写 T3 就没管它。快结束时想写这题暴力又忘了题意是啥了【】。
\(0+100\)。
题意
数轴上有 \(n\) 个点,构成了 \(\frac{n(n+1)}2\) 个线段。令所有线段为全集。问有多少子集,满足这个子集内的线段,在两两不交的情况下能选出的最多线段数恰好为 \(k\)。\(k \le n \le 500\)。
做法
如果暴力 dfs,那么 check 的做法是经典贪心。即将所有线段按照右端点排序,然后顺次判断能不能选这条线段。见 AcWing 908.。
数据范围不大,考虑狠狠地 DP。
设 \(f(i, j)\) 表示当前贪心得到的最大右端点的位置 \(\le i\),且最优策略中选择的线段数量为 \(j\) 时的总方案数。
或者,\(f(i, j)\) 即有多少个原题的答案的线段集合,使得这个集合的最优选择中最靠右的线段的右端点 \(\le i\),且最优方案选择的线段数量为 \(j\)。
转移。枚举倒数第二大的最优选择中的线段的右端点 \(p\)。我们考虑线段 \([l, r]\)(\(l \le r \le i\)):
- 若 \(r \le p\):那么这条线段在 \(f(p, j - 1)\) 中已经被计算过了。
- 若 \(l \le p\) 且 \(p < r < i\):这条线段一定不在 \(f(i, j)\) 的最优选择中。所以这样的线段可有可无,方案是 \(2^{p (i-p-1)}\)。
- 若 \(p \le l < r < i\):这条线段如果存在,就不满足「最优选择中最靠右的线段的右端点为 \(i\)」这个条件。所以这样线段不能出现。
- 若 \(l \le p\) 且 \(r = i\):这条线段一定不在 \(f(i, j)\) 的最优选择中。所以这样的线段可有可无,方案是 \(2^p\)。
- 若 \(p < l\) 且 \(r = i\):这条线段可能是 \(f(i, j)\) 状态中所说的「最优选择中最靠右的线段的右端点为 \(i\)」的线段,但是这条线段只能有一条,而剩下的线段可有可无。方案是 \((2^{i-p} - 1)\)。
综上转移:
初始化:
- \(f(i, 0)\):表示最优方案选择的线段数量为 \(0\)。显然只用空集一个,答案为 \(1\)。
- \(f(0, i)\):表示线段右端点为 \(0\)。仍然只用空集一个,答案为 \(1\)。
快速幂是过不掉的。我们考虑预处理一些 \(2\) 的幂:
- \(2^p\),\(2^{i-p}\):线性递推。
- \(2^{p(i-p-1)}\):设 \(g_{i, j} = 2^{ij}\),那么转移 \(g_{i, j} = g_{i - 1, j} \times 2^j\) 或 \(g_{i, j} = g_{i, j - 1} \times 2^i\)。
B 计算
这场比赛开的第一道题。因为第一眼,原!
显然这两道题不一样【】
涨了很多见识,数论题也是可以 DP 的!
\(40+100\)。
题意
给定 \(k\) 个两两互质的正整数,求 \(1 \sim n\) 中有多少数不能被任意一个数整除。
做法
「多少数不能被任意一个数整除」= $n - $ 「多少数能被任意一个数整除」。
考虑 DP。设 \(f(n, k)\) 表示有多少个 \(1 \sim n\) 的数,能被 \(a_1,a_2\dots a_k\) 中的任意一个数整除。
很妙的转移!
其中,\(\lfloor n / a_k\rfloor\) 表示 \(1 \sim n\) 中能被 \(a_k\) 整除的数的个数,\(f(n, k - 1)\) 表示 \(1 \sim n\) 中能被 \(a_1\dots a_{k-1}\) 整除的数的个数。
显然这两个集合可能有交,即 \(1 \sim n\) 中既能被 \(a_k\) 整除,又能被 \(a_1 \dots a_{k-1}\) 中任意一个数整除的数。
如果一个数 \(x\) 是这两个集合的交,那么 \(\frac x{a_k}\) 一定能被 \(a_1 \dots a_{k-1}\) 中任意一个数整除。那么 \(\frac x{a_k}\) 的数量为 \(f(\lfloor n / a_k\rfloor, k - 1)\)。因为 \(x\) 和 \(\frac x{a_k}\) 一一对应,所以 \(x\) 的数量也是 \(f(\lfloor n / a_k\rfloor, k - 1)\)。
直接用 (u)map 转移空间复杂度会爆。优化方案有两种:
方法一:整除分块。
前排提醒,这种做法在时间上被卡常乐【】
对于每一个有效的状态 \(f(i, j)\),这个 \(i\) 一定是由给定的 \(n\) 开始,不断除以某个 \(a_k\) 下取整得到的。根据 知识 我们得知这样的 \(i\) 的数量是根号级别的。
因此我们可以双指针得到 \(n\) 除以某个数下取整可能的得到的值(如上所述,数量是根号级别的),将其离散化即可。
离散化后转移可以双指针,一个指向 \(n\),一个指向 \(\lfloor n / a_k\rfloor\)。
而且这个状态的第二维可以滚动优化。空间复杂度做到了根号。
后排提醒,这种做法在时间上被卡常乐【】
方法二:暴力 + 记忆化。
我们设一个阈值 \(B\),然后记忆化转移。对于状态 \(f(i, j)\) 若 \(i < B\) 则用数组记忆化。否则直接转移不记忆了。这里我取的 \(B = 10^6\)。不难(?)证明这样的复杂度是正确的。
C 球
罪魁祸首。
这是一个难想+难写+难调的做法。最终代码 5KB。
\(0+100\)。
题意
做法
我们给每个空隙一个属性:
其中 \(s_i\) 表示与空袭 \(i\) 相邻的两个边的状态。
模拟一下可以发现,如果要反转边 \([l, r]\),首先我们可以分类讨论出 \(a_l\) 和 \(a_{r+1}\) 的变化,其次 \(a_{l+1}\dots a_r\) 都会变成它的相反数。
考虑询问。如果在两个相邻的山峰(\(a_i=+\infty,s_i = \texttt{/\\}\))间扔球,那么这些球都有相同的归宿。所以答案为 \([l-1, r]\) 中相邻的两个 \(+\infty\) 的下标差的最大值。
写一颗 5KB 线段树即可。
在查询之前我们可以先将 \(a_{l-1}\) 和 \(a_r\) 设成 \(+\infty\)。显然现在我不知道当时我这么写的原因了,反正这样写能烧掉很多特判。
D 数列
神秘题,数学推导没听懂。
\(0+40\)。
说一下 40 分暴力:对于每个 \(k \in [1, 100],n\in[1,10^5]\) 预处理一张答案表。预处理总复杂度是 \(10^7\) 级别的,即暴力枚举每一次加数。
8.7 模拟赛
4.5 小时 5 道题。
有一道炼石的题,那场我们打过,当时那题场切了。但是现在不会做了【】
有一道 CF 某 div.2 F 的弱化。没做出来【】
T1. 降温
赛时想出了做法,拍了一点小数据。但是最后被浮点数的精度和 __int128 挂了。
\(60+100\)。
题意
有 \(n\) 个装置,每个装置有初始温度 \(t_i\)。
给定正整数 \(A, B\),一次降温操作可以将一个装置温度降低 \(A\),剩下 \((n - 1)\) 个装置温度降低 \(B\)。
求至少需要多少次降温操作才能让所有温度严格小于 \(0\)。
My Solution
我们称将一个数减少 \(A\) 为特殊操作,减少 \(B\) 为特殊操作。显然特殊操作的最小次数即答案。
不妨令对 \(i\) 进行了 \(x_i\) 次特殊操作。我们二分它们的和 \(\sum x_i = X\),即答案。
对于 \(i\) 而言,它的特殊操作次数为 \(x_i\),普通操作次数为 \(X - x_i\)。那么它被减少的量为 \(x_i \cdot A + (X - x_i) \cdot B\)。只有这个值 \(> t_i\) 才能满足要求。
那么 check 要做的就是判断是否存在一个这样的 \(x\) 数组,使得每项均为非负整数,且所有数的和为 \(X\),且:
做一些简单的推导:
不等式上做除法不太好做。考虑分类讨论:
若 \(A = B\),那么在最开始特判即可。答案为 \(\max\{ \lfloor \frac{t_i}A \rfloor +1\}\)。
若 \(A > B\),那么直接除:
右边是个常数。我们可以求出在这样的情况下 \(x_i\) 的最小值。若每个 \(x_i\) 的最小值之和 \(\le X\) 则 check 合法。
若 \(A < B\),除过去要变号:
同理我们可以求出每个 \(x_i\) 的最大值。若每个 \(x_i\) 的最大值之和 \(\ge X\) 则 check 合法。
std Solution
一次降温操作是选择一个减 \(A\),剩下全减 \(B\)。那么我们可以将所有数先全减 \(B\),在选择某个数加上 \(A - B\)。
仍然二分答案 \(X\)。令 \(a_i = t_i - B \cdot X\)。此时我们需要判断,能否执行 \(X\) 次操作,每次操作会选择一个数加上 \(A - B\),使得最终整个序列均为负。
\(A = B\) 太水了。我们考虑:
- \(A > B\):这样的操作是劣的。因此我们每次找当前的最大值执行这样的操作。
- \(A < B\):这样的操作是优的。因此我们每次找当前的最小值执行这样的操作。
真的操作复杂度不对。
- \(A > B\):维护 \(b_i = \left\{ \begin{matrix} 0 &,a_i \ge 0 \\ \left\lfloor \dfrac{-a_i}{A-B} \right\rfloor + 1&,a_i < 0 \end{matrix}\right.\)。问题等价于 \(\sum b_i \le X\)。
- \(A < B\):同理。不写了。
代码没写。
T2. 数学题
\(70+40+100\)。
以为会 70。但是 \((10^4)^2 \times 10 \times 10\) 你觉得能不能过?
题意
求 \(L, R\) 内有多少数的数码种类为 \(A\)。\(L, R\) 位数都为 \(n \le 2 \times 10^5\)。
做法
差分转化。考虑 \(1 \sim x\) 的答案。
数位 DP 套路地枚举 \(y \in [1, x]\) 的第一个与 \(x\) 不同的位置 \(i\),并枚举这一位填什么。这样我们就得到了 \(y\) 的前 \(i\) 位,且 \(i + 1 \sim n\) 位都可以 \(0 \sim 9\) 任意填。
我们可以求出前 \(i\) 位的种类数 \(B\)。如果 \(B > A\) 那么不可能。否则如果想让 \(y\) 的数码种类为 \(A\),那么 \(y\) 的 \(i + 1 \sim n\) 位中,一定存在恰好 \((A - B)\) 个与前 \(i\) 位不同的数。这个的方案是 \(\dbinom {10-B}{A-B}\)。
接下来的问题是,在 \((n - i)\) 位中,每个数都有 \(A\) 种填法,但是有 \(B\) 个数至少出现一次。求方案数。
我们容斥枚举,有多少个必选的数没出现。式子:
复杂度 \(10^2n\)。
T3. 均衡区间
去年做过,而且场切了。现在不会了。
\(30+30+100\)。
题意
给定序列 \(a\),\([l, r]\) 是均衡的当且仅当这个区间的最大值和最小值都不等于 \(a_l\) 和 \(a_r\)。分别求以 \(i\) 为左端点和右端点的均衡区间个数。
\(n \le 10^6\)。
做法
可以轻易求出 \(i\) 左/右边第一个比自身大/小的位置,单调栈维护。然后我们可以维护 \(f(i)\) 表示当 \(i\) 为右端点时,只要左端点在 \([1, f(i)]\) 内右端点就不是区间最大值或最小值。同理 \(g(i)\) 表示左端点,右端点在 \([g(i), n]\) 就合法。
那么 \([l, r]\) 合法等价于 \(l \le f(r)\) 且 \(g(l) \le r\)。固定 \(r\)。剩下的是二维数点,即平面上在 \((f(r), r)\) 下面的 \((l, g(l))\) 的数量。
T4. 几何题
原 CF1991F。
但是仍然不会做。
但是即使会做这题也被卡常乐。
\(45+45+100\)。
题意
维护 \(n\) 根木棍长度。单点修改,求区间内的木棍组成的三角形的最大周长。
做法
首先 CF1991F,我们得知当区间长度 \(\ge 50\) 时一定有解。那么不妨取出前 \(50\) 大的数。这些数也一定有解,而且最大。
暴力做长度 \(50\) 也是 CF1991F。只需要判断每相邻三个即可。
所以我们要做的是求区间前 \(50\) 大。可以线段树归并排序,也可以每次取最大值,再把最大值的位置设为 \(-1\)。
T5. 集合题
神秘题。
\(30+30+30\)。
8.8 讲课:状压 DP、数位 DP
P1896 状压 DP。模板题。有一种神秘的轮廓线做法 dan shi wo tai cai le。
CF1209E12 状压 DP。很妙的题。两个巧妙的关键点(去最大值限制、将 \(m\) 降到 \(n\))都没想到。
P9131 状压 DP + 高维前缀和。想到了一半。
CF55D 数位 DP。用到了一些整除性质。
CF1245F 数位 DP。以前做过。
8.9 讲课:前缀和优化 DP,单调队列优化 DP
P8865 前缀和:前缀和在计数题上的简单应用。去年做过。
CF79D 前缀和,状压 DP,最短路:以前做过。是很妙的题。但是前缀和思想并不占这道题难度的大比重。
P1886 单调队列:模板题。
P3084 DP优化:单调队列优化好题。但我用线段树。
8.10 模拟赛
盖世计划--C班--潍坊营--8月10日 - 比赛 - 梦熊联盟 (mna.wang)
盖世计划--C班--潍坊营--8月10日 【订正】 - 比赛 - 梦熊联盟 (mna.wang)
T1. 划分
\(100+100+100\)。
硬控两个小时。
题意
给定一个长为 \(n\) 的正整数序列,将其划分成尽可能少的子序列(不要求连续),满足每个子序列都有绝对众数(即出现次数严格大于序列长度一半的数)。
做法
枚举出现次数最多的数,然后让出现次数尽量少的和它匹配成一组。
我们统计每种数的出现次数,并从小到大排序。那么答案为最小的 \(i\) 满足 \(\sum_{j \le i} t_j \ge \sum_{j > i} t_j - i\),表示后面的数都可以和前面的数中的任意一个组成一组。
T2. 凹包
\(48+48+100\)。
题意
做法
一个中心格有 \(4\) 个边缘格,两个竖着两个横着。那么这个凹包一定从竖着的边缘格中选一个,从横着的边缘格中选一个。
如图。\(mid\) 是中心格。我们要在 \(v_0\) 和 \(v_1\) 中选一个,\(v_1\) 和 \(v_3\) 中选一个。
将 \(v_0\) 和 \(v_2\) 连边,\(v_1\) 和 \(v_3\) 连边。那么答案为对每条边的定向方案,使得每个点的入度都 \(\le 1\)。
注意一点,这四个边缘点可能不存在。若同一行或同一列中存在 \(2\) 个边缘点则将它们连边,\(1\) 个的话连自环,\(0\) 个的话答案为 \(0\)。
这个想法太人类智慧了,作为人类的我根本不可能想到。说一下人类是怎么想到的。
我们将一个 \(mid\) 点拆成两个点 \(mid_0\) 和 \(mid_1\),连边 \((mid_0,v_0),(mid_1,v_1),(mid_0,v_2),(mid_1,v_3)\)。此时整张图是一个二分图。答案为二分图的完美匹配数量。
显然 NPC。但是由于一个左部点只连向两个右部点,所以我们可以直接把左部点删掉,即将 \((mid_0, v_0),(mid_0,v_2)\) 合并成 \((v_0, v_2)\),\((mid_1, v_1),(mid_1,v_3)\) 合并成 \((v_1,v_3)\)。转化成了上面的定向问题。
显然我们可以对每个连通块单独考虑,它们的乘积即答案。
我们考虑这个连通块中的点数 \(n\) 和边数 \(m\)。注意可能有自环。显然因为联通所以 \(m \ge n + 1\)。
- \(n = m - 1\),是一颗树。显然一定存在一个点的入度为 \(0\)。枚举这个点,发现剩下的边的方向都确定了。所以答案为 \(n\)。
- \(n = m\),基环树。中间的环有两种定向方案,除非中间是个自环(此时是 \(1\))。剩下的边的方向也确定了。所以答案为 \(1\) 或 \(2\)。
- \(n > m\):鸽巢原理,一定有一个点的入度 \(> 1\)。答案为 \(0\)。
T3. 删除
题意
\(14 + 30 + 88\)。
做法
我们考虑没有问号。
如果一个串能被完全消除,有两个显然的必要条件:
- \((a + b) \mid n\);
- \(cnt_0 = \dfrac{na}{a+b},cnt_1 = \dfrac{nb}{a+b}\)。
归纳证明这两个条件是充分的,即满足这两个条件的情况下,一定可以操作一次。
将整个序列化成 \(\dfrac n{a+b}\) 个长度为 \(a + b\) 的段。如果存在一个段的 \(0\) 的数量为 \(a\),那么合法。
否则一定存在两个相邻的段,其中 \(0\) 的个数一个 \(< a\) 一个 \(> a\)。令 \(0\) 的个数 \(< a\) 的段为 \(L_0\),另一个为 \(L_1\)。考虑一个窗口从 \(L_0\) 开始,每次移动一步,知道完全移动到 \(L_1\)。显然移动一步后,\(0\) 的个数的变化量必不超过 \(1\)。所以这个滑动过程中这个 \(0\) 的个数的函数是连续的。一个连续函数从 \(< a\) 到 \(> a\) 一定存在一个位置 \(= a\)。这个位置就是一个合法的操作区间。
还是考虑没有问号情况下,最多的操作次数(即 Sub 6)。
我们把它的每个可以完全消除的极长字串消除。反证法易得剩下的字符无法消除。
考虑原题。
考虑 DP。设 \(f(i)\) 表示 \(1 \sim i\) 的答案。考虑 \(i\) 能转移到哪些 \(j\)。
首先显然有 \(f(i) \xrightarrow {1} f(i+1)\)。
剩下的能转移到的 \(j\) 需要满足 \([i+1,j]\) 是能被完全消除的。即:
- \(i \equiv j \pmod k\);
- \(01\) 分别的出现次数小于等于两个常数。
前缀和做第二个条件。暴力枚举 \(j\) 转移即可。这样的复杂度是 \(\mathcal O(n / (a+b))\)。所以得了 \(88\) 分。
正解用到了在线的二维偏序。显然不会。一天后会了。
8.11 讲课:决策单调性,李超线段树
QOJ 5507 四边形不等式优化 DP:区间逆序对数满足四边形不等式的 trick。
P4097 李超线段树模板:插入的是线段而不是直线有点恶心。
P4655 李超树斜率优化:如题。
P3810 cdq 分治模板:如题。
8.12 讲课:动态开点线段树,线段树合并
CF600E Lomsat gelral 线段树合并:经典题。
P4556 [Vani有约会] 雨天的尾巴 /【模板】线段树合并:模板题。
HDU 7435. 树 线段树合并:简单题。
P8496 [NOI2022] 众数:神秘题。虽然但是我觉得在日志里求调代码不太好
8.13 模拟赛
盖世计划--C班--潍坊营--8月13日 - 比赛 - 梦熊联盟 (mna.wang)
盖世计划--C班--潍坊营--8月13日 【订正】 - 比赛 - 梦熊联盟 (mna.wang)
简单场。但是特判数据后没有 return 0 挂了 60 分。
A. 计数
大水题。又是 NOIP 放普及题。
\(100+100+100\)。
题意
定义一个字符串是好的,当且仅当它包含的所有字符出现次数相同。
求好的子串数。
做法
分类讨论这个子串种出现的字符种类:
- \(1\) 种:求出所有这样的极长连续段。答案为 \(\sum \dfrac{len(len + 1)}2\)。
- \(2\) 种:做前缀和。那么区间 \([l + 1, r]\) 合法等价于 \(s_r - s_l = t_r - t_l\),移项的 \(s_r - t_r = s_l - t_l\)。用一个桶维护这个差即可。
- \(3\) 种:仍然前缀和。\([l + 1,r]\) 合法等价于 \(s_r - s_l = t_r - t_l\) 且 \(t_r - t_l = q_r - q_l\)。分别整理得 \(s_r - t_r = s_l - t_l,t_r-q_r=t_l-q_l\)。开个二维桶维护这两个差。
B. 序列
挂 \(60\) 原因:
cin >> q;
if (特殊性质) {
while (q -- ) {
...
}
// 是不是这里少了点东西
}
while (q -- ) {
}
聪明的你看懂了吗?
\(100+40+100\)。
题意
大体就是有一个 \(a\),多次询问求有多少区间的和为 \(x\)。
做法
大家好,我叫只会莽式子不会找规律的后面忘了。
注意到,我们的注意力十分集中。因此注意到对于奇数 \(i\) 都有 \(a_i+a_{i+1} = n+1\),对于偶数 \(i\) 都有 \(a_i + a_{i+1}=n+2\)。
我们称对于奇数 \(i\) 而言,\([i, i+1]\) 为「段」,对于偶数 \(i\) 而言,\([i, i+1]\) 为「如段」。那么每个段的和为 \(n+1\),每个如段的和为 \(n+2\)。
我们考虑分类讨论区间的左右端点的奇偶性:
- 左奇右奇。那么 \([l, r]\) 一定跨越了若干个完整的段。又因为每个段的和是固定的 \(n + 1\),所以有解的前提是 \(n+1 \mid x\)。若满足这个条件,则相当于在总共的 \(\lfloor n/2\rfloor\) 段中,选出连续的 \(x / (n+1)\) 段。答案为前者减后者加一。
- 左偶右偶。与上面类似,\([l, r]\) 一定跨越了若干个完整的如段。有解的前提是 \(n + 2 \mid x\)。答案为从 \(\lfloor (n-1)/2\rfloor\) 段种选出连续的 \(x / (n+2)\) 段的方案数。
- 左奇右偶。较复杂。\([l, r]\) 一定是在跨越若干个完整段的基础上,右端点新开了一个。我们不妨枚举右端点所对应的数 \(i\)。答案为合法 \(i\) 的数量。首先一个整除条件是 \(n + 1 \mid x - i\)。而且还要满足左面的段够用,即需要用的段数 \((x-i)/(n+1)\) 小于等于 \(i\) 前面的总段数 \(i-1\)。我们可以解这个不等式,得到一个 \(i\) 的范围。同时因为 \(n + 1 \mid x - i\),所以 \(x, i\) 在模 \(n+1\) 意义下是相同的。所以问题转化成了求一个区间内有多少数模 # 为 #。这是极易的。
- 左偶右奇。很复杂。同理我们枚举不在完整如段的左端点所对应的数 \(i\),解一个不等式,并求这个范围内有多少数模 # 为 #。具体推到上较复杂且容易出错。
可以庆幸的是这道题在处理不等式上没有像 降温 一样的恶心编号。但这也是唯一可以庆幸的。
C. 函数
很好的题目。
\(60+60+80\)(还有些小错误没补题满分)。:
题意
设 \(x\) 是自然数,定义 \(f(x) = x \oplus 2^{\operatorname{popcount}(x)}\),其中 \(\operatorname{popcount}(x)\) 是 \(x\) 二进制表示下 \(1\) 的个数,\(\oplus\) 是二进制下按位异或。
给定 \(L, R\),求 \([L, R]\) 中有多少个数 \(y\),满足存在一个 \(x\) 使得 \(f(x) = y\)。
多组询问。
做法
注意到 \(x, y\) 的 \(\operatorname{popcount}\) 的差一定为 \(\pm 1\)。不妨设 \(\operatorname{popcount}(y) = k\)。
如果 \(y\) 比 \(x\) 的 \(1\) 的数量多一,就代表 \(x\) 的第 \(k - 1\) 位原来为 \(0\),异或上 \(2^{k-1}\) 后成了 \(y\)。
同理,如果 \(y\) 比 \(x\) 的 \(i\) 的数量少一,就代表 \(x\) 的第 \(k + 1\) 位原来为 \(1\),异或上 \(2^{k+1}\) 后成了 \(y\)。
所以问题等价于求 \([L, R]\) 内有多少数 \(y\) 满足 \(x\) 的第 \(k-1\) 位为 \(0\) 或第 \(k + 1\) 位为 \(1\),其中 \(k = \operatorname{popcount}(y)\)。这是一个数位 DP 的问题。
首先差分去掉下界。然后我们枚举 \(i\) 表示 \(y\) 的第 \(i\) 位之前都和 \(R\) 相同,第 \(i\) 位为 \(0\),剩下的位 \(0/1\) 人填。再枚举 \(k\)。剩下的是一些恶心的分类讨论。差不多就做完了。
D. 数字生成树
\(20+20+60\)。
简单说一下 \(60\) 分做法。我们贪心地在二进制位上从高到低考虑,判断答案的这个位能否为 \(0\)。若第 \(i\) 位可以是 \(0\),就代表所有边权的第 \(i\) 位为 \(1\) 的边都不会被加入 mst。因此我们将这些边删掉,然后判断剩下的图中的点是否仍联通即可。用并查集。
8.14 & 8.15 讲课:欧拉路,二分图,网络流
网络流相关见 网络流。
P2731 [USACO3.3] 骑马修栅栏 欧拉路:经典题。找一个度数为奇数的点开始 dfs,若不存在则任选一个,在回溯的时候将当前点计入答案。最后将答案序列翻转即可。为啥这样做?不用管,记住就行【】
P9731 [CEOI2023] Balance 欧拉路:不会写代码,只会写题解【】
LOJ.536 花札 二分图博弈。没学动,遂背代码【】【】【】
8.16 模拟赛
盖世计划--潍坊营--0816 --C班模拟 - 比赛 - 梦熊联盟 (mna.wang)
盖世计划--潍坊营--0816--C班模拟【订正】 - 比赛 - 梦熊联盟 (mna.wang)
赛时一分没挂!
赛后都补完啦!
A. 石子
\(100+100+100\)。
太水了。我写了一颗线段树,事实上直接 \(\mathcal O(n)\) 扫描也行。
不写了。
B. 铁路
\(100+100+100\).
难度很想 ABC E。关键是好像真的是日本题(?)
题意
给定一张无向图。求有多少 \(u < v\) 满足在 \(u, v\) 间连一条边权为 \(l\) 的边后,\(s \rightsquigarrow t\) 的最短路 \(\le k\)。
做法
首先判掉最开始 \(s \rightsquigarrow t\) 的最短路已经 \(\le k\) 的情况。答案是 \(\binom n2\)。
否则,若原来最短路 \(> k\),但加上 \((u, v)\) 这条边后最短路 \(\le k\) 了,那么这条最短路已经经过 \((u, v)\) 这条边。
那么 \(s \rightsquigarrow t = s \rightsquigarrow u + (u,v) + v \rightsquigarrow t\),其中前一部分和后一部分都可以预处理。于是问题转化成了:
- 求有多少 \(u < v\) 满足 \(a_u+l+b_v\le k\) 或 \(a_v+l+b_u\le k\)。
显然可以移项。显然可以固定 \(u\) 并二分查找 \(v\)。显然这个问题是极易的。
C. 迷宫
\(10+10+100\)。
我真的不会搜索。
https://www.luogu.com.cn/article/1cg85s6k
D. 跑步
\(15+15+100\)。
远超我的解题能力的题。