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, j) = \sum_{p=0}^{i-1} f(p,j-1)\times 2^{p(i-p-1)} \times 2^p \times (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\) 中的任意一个数整除。

很妙的转移!

\[f(n, k) = \lfloor n / a_k\rfloor + f(n, k - 1) - f(\lfloor n / a_k\rfloor, k - 1) \]

其中,\(\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\)。不难(?)证明这样的复杂度是正确的。

极其相似的题有 CF1806E,比较相似的题有 ABC365G

C 球

罪魁祸首。

这是一个难想+难写+难调的做法。最终代码 5KB。

\(0+100\)

题意

太长了回去看吧

做法

我们给每个空隙一个属性:

\[a_i = \left\{ \begin{matrix} 1&, s_i = \texttt {//} \\ -1 &,s_i = \texttt{\\\\} \\ +\infty&,s_i = \texttt{/\\}\\ -\infty&,s_i = \texttt{\\/}\end{matrix}\right. \]

其中 \(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\),且:

\[x_i \cdot A + (X - x_i) \cdot B > t_i \]

做一些简单的推导:

\[x_i \cdot (A - B) > t_i - X \cdot B \]

不等式上做除法不太好做。考虑分类讨论:

\(A = B\),那么在最开始特判即可。答案为 \(\max\{ \lfloor \frac{t_i}A \rfloor +1\}\)

\(A > B\),那么直接除:

\[x_i > \dfrac{t_i - X \cdot B}{A - B} \]

右边是个常数。我们可以求出在这样的情况下 \(x_i\) 的最小值。若每个 \(x_i\) 的最小值之和 \(\le X\) 则 check 合法。

\(A < B\),除过去要变号:

\[x_i < \dfrac{t_i - X \cdot B}{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\) 个数至少出现一次。求方案数。

我们容斥枚举,有多少个必选的数没出现。式子:

\[\sum_{c=0}^B (-1)^c\dbinom Bc (A-c)^{n-i} \]

复杂度 \(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,最短路:以前做过。是很妙的题。但是前缀和思想并不占这道题难度的大比重。

CF1615F 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\) 个边缘格,两个竖着两个横着。那么这个凹包一定从竖着的边缘格中选一个,从横着的边缘格中选一个。

\[\begin{matrix} 0 & v_0 & 0 \\ v_3 & mid & v_1 \\ 0 & v_2 & 0 \end{matrix} \]

如图。\(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 欧拉路:不会写代码,只会写题解【】

POJ.3041 Asteroids 二分图:一眼题。

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\)

远超我的解题能力的题。

https://www.luogu.com.cn/article/liyqb0p0

posted @ 2024-08-08 22:11  2huk  阅读(92)  评论(2编辑  收藏  举报