题解合集
Codeforces Round 1996
A. Legs
显然地,我们想尽可能多的使用牛。
所以当 \(n\) 为 \(4\) 的倍数时,全都使用牛,否则使用一只鸡,剩下的使用牛,AClink。
B. Scale
我们只需要对每个小矩阵中取一个值输出即可,AClink。
C. Sort
如果 \(\mathrm{sort}(a[l..r])=\mathrm{sort}(b[l..r])\), 那么说明 \(a[l..r]\) 中每个字母的个数和 \(b[l..r]\) 相等,所以想让 \(\mathrm{sort}(a[l..r])=\mathrm{sort}(b[l..r])\) 的操作数,也就是每个字母在 \(a[l..r]\) 与 \(b[l..r]\) 中的差的和。
使用前缀和来快速的求 \(a[l..r]\) 与 \(b[l..r]\) 中每个字母的个数,时间复杂度 \(\Theta(Tn)\),AClink。
D. Fun
假设我们确定了未知数 \(a,b\) 的值,那么这个问题是好做的。
容易得到:\(\left\{\begin{matrix}c \le x-a-b\\c\le \dfrac{n-ab}{a+b}\end{matrix}\right.\),所以答案等于 \(\min\{x-a-b,\left \lfloor\dfrac{n-ab}{a+b} \right \rfloor \}\)。
我们尝试枚举所有可能的 \(a\),发现此时的 \(b\) 需要满足 \(b\le\min\{\dfrac{n}{a},x-a\}\)。事实上,我们可以据此来枚举所有的 \(b\),并根据上述分析计算所有的 \(c\)。当 \(n,x\) 均为 \(10^6\) 时,即使每次只使用 \(\left \lfloor\dfrac n a \right \rfloor\) 来枚举,那么共进行 \(13970034\) 次枚举,实际的操作会取一次 \(\min\),所以实际操作数会小于这个值,这个复杂度是我们可以接受的,AClink。
E. Decode
我们记一个前缀和数组 \(pre\),如果 \(a_i=1\),那么 \(pre_i=pre_{i-1}+1\),否则 \(pre_i=pre_{i-1}-1\)。那么如果 \(a[l..r]\) 中的 \(01\) 数量相等,当且仅当 \(pre_r-pre_{l-1}=0\) 时,即 \(pre_r = pre_{l-1}\)。
计算子串的子串中含有 \(01\) 相等的数量很难,我们可以先找到所有 \(01\) 相等的子串,再统计包含它们的子串的数量。
如果 \(x,y\) 满足 \(pre_{x}=pre_y\),那么 \(a[x+1..y]\) 中有相同数量的 \(01\),包含它的子串共有 \((x+1)(n-y+1)\) 个。
记所有满足 \(pre_{x}=pre_y\) 的 \(y\) 分别为 \(y_1,y_2,\cdots,y_k\),那么这部分的答案为 \((x+1)(n-y_1+1)+(x+1)(n-y_2+1)+\cdots+(x+1)(n-y_k+1)\),即 \((x+1)(nk-\sum y_i+k)\),所以我们可以记录所有 \(y_i\) 相等的 \((n-y_i+1)\) 的和,然后乘 \((x+1)\) 更新答案,AClink。
F. Bomb
先不考虑时间复杂度,由于每轮操作相互独立,所以有一个显然的贪心:每轮取所有元素中最大的计入分数,并将其设为 \(\max\{0,a_i-b_i\}\)。我们可以使用优先队列来维护,时间复杂度 \(\Theta(Tk\log n)\)。
考虑当 \(k\) 很大的时候,执行上述贪心,此时所有的 \(a_i\) 应该近似相等,不会出现一个数特别大的情况。考虑找到一个最大的 \(x\),使得在执行 \(k\) 步操作后,对于所有 \(i\) 有 \(a_i \ge x\),这部分可以使用二分。根据 \(x\) 计算出所需的最小的步数 \(t\),然后使用 \(k-t\) 执行上面的贪心,时间复杂度 \(\Theta(Tn\log k)\)。
G. Penacony
我们发现一定有一段路可以不被使用。我们可以尝试枚举这段不被使用的路,这样一个环就变成了一条链,所有要求连接的点的路径全都可以确定了。所以我们可以维护一个序列,把要求的路径 \(+1\),最后统计其中含有 \(0\) 的数量,可以使用线段树来维护。
枚举所有不被使用的道路,并计算其中 \(0\) 的数量。我们可以快速根据前一个的不被使用的道路来更新目前枚举的道路,时间复杂度 \(\Theta(Tn \log n)\),AClink。
Codeforces Round 1983
CF1983B Corner Twist
注意到如果 \(a\) 可以转换成 \(b\),那么 \(b\) 数组的每一行和每一列的和与 \(a\) 数组的每一行和每一列模 \(3\) 的值相等,因为执行运算中不会影响模 \(3\) 意义下的值。即此命题是原命题的充分条件。
下面通过构造出一种方法,来证明此条件为必要条件。
依次取 \(i = 1,2,\cdots,n-1,j = 1,2,\cdots,n-1\):
- 如果 \(a_{i,j}+1\equiv b_{i,j}\pmod3\) 那么在把 \(\begin{matrix} a_{i,j} & a_{i+1,j} \\ a_{i,j+1} &a_{i+1,j+1}\end{matrix}\) 设为 \(\begin{matrix} a_{i,j}+1 & a_{i+1,j}+2 \\ a_{i,j+1}+2 &a_{i+1,j+1}+1\end{matrix}\),这样可以保证 \(a_{i,j}=b_{i,j}\);
- 如果 \(a_{i,j}+2\equiv b_{i,j}\pmod3\) 那么在把 \(\begin{matrix} a_{i,j} & a_{i+1,j} \\ a_{i,j+1} &a_{i+1,j+1}\end{matrix}\) 设为 \(\begin{matrix} a_{i,j}+2 & a_{i+1,j}+1 \\ a_{i,j+1}+1 &a_{i+1,j+1}+2\end{matrix}\),这样可以保证 \(a_{i,j}=b_{i,j}\)。
这样就可以保证对于所有的 \(i = 1,2,\cdots,n-1,j = 1,2,\cdots,n-1\),均有 \(a_{i,j}=b_{i,j}\)。
因为操作不改变模 \(3\) 意义下的值,上面已经保证了 \(b\) 的每一行和每一列的和与 \(a\) 的每一行和每一列模 \(3\) 的值相等,所以有 \(a=b\)。
所以只需判断每一行或列的和模 \(3\) 的值是否相等即可,AClink.
CF1983C Have Your Cake and Eat It Too
设蛋糕先分给 Alice,然后给 Bob,最后给 Charlie。那么有 \(a_l<a_r<b_l<b_r<c_l<c_r\)。那么显然 \(a_l=1,c_r=n,a_r=b_l-1,b_r=c_l-1\) 时一定合法,因为这样只会导致 Alice 和 Charlie 被分到的蛋糕价值增加,而 Bob 的价值不变。
所以我们可以 \(\Theta(n)\) 的找到 \(a_r,b_r\) 的最小值。通过枚举 Alice,Bob,Cherlie 的顺序,就可以解决这个问题。
介绍一个解决此问题好用的函数:全排列函数 next_permutation,用法很简单,不作另外的讲解,参考下面的代码。
CF1983D Swap Dilemma
首先发现对于任何一个操作满足 \(l-r=q-p\),都可以通过 \(\mathrm{swap}(l,l+1),\mathrm{swap}(l+1,r),\mathrm{swap}(p,p+1),\mathrm{swap}(p+1,q)\) 来完成,所以我们只需要判断两个序列能不能通过相同数量的交换两个相邻的元素而转换成相同的数组即可。
显然 \(a\) 和 \(b\) 的元素必须相等。不妨设转换后的数组为排序后的 \(a\),记为 \(s\),因为重复两次交换相邻元素可以使数组不变,所以只需统计 \(a\) 转变到 \(s\) 所需的操作次数和 \(b\) 转变到 \(s\) 所需的操作次数,并判断奇偶性是否相同即可,AClink.
CF1995C Squaring
无解很显然:对于所有的 \(2\le i\le n\),当第 \(i\) 位为 \(1\) 且第 \(i-1\) 位 \(>1\) 时,无解。
我们从左到右进行贪心地进行操作,我们尝试通过枚举出最小的平方数使得前 \(i\) 项满足要求。但是这样导致会导致运算中的数字太大,即使 int128 也难以满足要求。
所以,我们可以考虑在对数意义下进行操作。对 \(a\) 中所有元素取对数,那么有 \(\log x^2=2\log x\),所以平方操作就变成了 \(\times 2\)。
但这样还是很大,我们可以再取一次,那么有 \(\log\log x^2=\log 2x=\log x+\log2\),这样,我们就把每步平方操作变成了加 \(\log 2\)。
所以,我们取 \(b_i = \log\log a_i\),如果 \(b_i <b_{i-1}\),设 \(k=\left \lceil \dfrac{b_{i-1}-b_i}{\log2} \right \rceil\),那么就把 \(b_i\) 加上 \(k\times\log 2\) 然后答案加上 \(k\) 即可。
注意对浮点误差的处理,AClink.
P7497 四方喝彩
建议做本题之前,先做 【模板】线段树 1 和 P3373 【模板】线段树 2。这样我们只需要考虑操作 3 就可以了。
开始我觉得只需要维护区间封锁的持续时间就好了,在被封锁时不更新区间,这道题太简单了!
但其实这是不对的。我们举个例子:现在有区间 \([1, 2]\) ,先把区间 \(\times2\),此时父节点的乘法懒标记为 \(2\) 。对第 \(2\) 个节点封锁 1 个单位时间,然后再把整个区间 \(\times2\),此时父节点的乘法懒标记为 \(4\),然后查询第二个点。问题来了,此时要下传懒标记,但是父节点有一部分懒标记是在所求的子节点被封锁时变化的,不应该下传那部分懒标记。维护每次懒标记的时间并判断是否下传不太可行,所以这个做法是不对的。
但我们可以根据上面想到,虽然我们不能根据父节点的懒标记直接更新子节点,但我们可以记录子节点的信息,并判断如何更新。具体的讲,对于每个点,我们记录其所表示区间中被未被封锁的数量、被封锁的元素的和、未被封锁的元素的和、被封锁的时间、乘法懒标记和加法懒标记。
想清楚这些,我们就可以开始写了,AClink.
P1013 [NOIP1998 提高组] 进制位
结论
-
设表里有 \(n\) 个数,那么一定是 \(n\) 进制。
-
如果这个数字所在的行出现了 \(x\) 个两位数, 那么这个数就是 \(x\)。
证明 -
设 \(n\) 个数中最大的为 \(k\) ,\(a\) 进制。
则表里一定会出现 \(k+k\)
如果 \(k+k\) 为 1 位数,则该值一定会在表里出现,不满足 \(k\) 为 \(n\) 个数中最大值。
可得 \(k+k\) 为两位数。\(\because k<a ∴k+k < 2a\) \(\because a\) 进制中第二位代表有几个 \(a\) \(∴\) \(k+k\) 的十位部分为 \(1\)。
\(∴\) \(1\) 一定在数字表里。
\(\because 1\) 在数字表里,\(∴1+1=2\) 在数字表里,\(1+2=3\) 在数字表里,以此类推,到 \(n-1\) 都在表里。
\(∵s_{i,1}\ne s_{j,1}\) ,\(∴a \geq n ∴1\) 到 \(n-1\) 都是一位数 ,且 \(n-1\) 为该进制中最大的数。若 \(n-1\) 不是最大的数,则最大的数一定会在如 \(n-2+2\) 时出现在表里,且是一位数。而表里的所有数为 \(1\) 到 \(n-1\),可知 \(n-1\) 该进制中最大的数。
\(∴\) 一定是 \(n-1\) 进制。 -
表格的顺序并不影响结果,所以我们可以把所有数字升序排列,因为所有数字为 \(0\) 到 \(n-1\) ,且进制为 \(n-1\),我们可以画出这样的表格:
\[\begin{array}{c|c|c|c|c} \rm + & \kern{.5cm} \rm \mathclap{1} \kern{.5cm} & \kern{.5cm} \rm \mathclap{…} \kern{.5cm} & \kern{.5cm} \rm \mathclap{n-2} \kern{.5cm} & \kern{.5cm} \rm \mathclap{n-1} \kern{.5cm} \\ \hline \rm 1 & \rm & \rm & \rm & \rm \\ \hline \rm … & \rm & \rm & \rm & \rm \\ \hline \rm n-2 & \rm & \rm & \rm & \rm \\ \hline \rm n-1 & \rm & \rm & \rm & \rm \ \\ \end{array}\]可以发现:\(1\) 只能和 \(n-1\) 相加时变成两位数, \(2\) 可以和 \(n-1\) 和 \(n-2\) 相加变成两位数,以此类推,可得出结论 2。
代码实现
判断是否有解:我的方法是先预处理出进制数和每个未知数的值,然后把表转换成 10 进制,进行判断,如果不符合要求则输出ERROR!。
代码实现并不困难,因此不在详细解释代码,细节问题参见注释,AClink.
P8883 幻想中成为原神
由于题目允许有误差,所以可以考虑使用概率估算。显然,我们只需要关注是否可以被质数的平方整除,因为如果一个数能被合数平方整除,那么一定能被质数平方整除。设质数为 \(p\),则当前数能被整除的概率是 \(\dfrac{1}{p^2}\),不能被整除的概率是 \((1-\dfrac{1}{p^2})\),对于所有可能的质数,所以总的答案就是 \(\prod\limits_p (1-\dfrac{1}{p^2})\)。
由欧拉乘积公式:\(\prod\limits_p(1-\dfrac{1}{p^\delta}) = \dfrac{1}{\sum_nn^{-\delta}}\)。代入 \(2\),得:\(\prod\limits_p(1-\dfrac{1}{p^2}) = \dfrac{1}{\sum_nn^{-2}}\)。
由巴塞尔问题得,所有正整数平方倒数和为 \(\dfrac{\pi^2}{6}\),即 \(\sum\limits_{n=1}^\infty \dfrac{1}{n^2} = \dfrac{\pi^2}{6}\)。所以 \(\prod\limits_p(1-\dfrac{1}{p^2})=\dfrac{6}{\pi^2}\)。
因为概率为有可能被杀死的丘丘人,所以应为:\(1 - \dfrac{6}{\pi^2} \approx 0.39207289814597337\),所以输出 \(n \times 0.39207289814597337\) 即可,AClink.
CF1996D Fun
假设我们确定了未知数 \(a,b\) 的值,那么这个问题是好做的。
容易得到:

浙公网安备 33010602011771号