Codeforces Round 748

Codeforces Round 748

A. Elections

Type:#OI Problem

Algorithm:#Brute Force

Source:#https://codeforces.com/contest/1593/submission/131928145

Task

给定 \(a,b,c\),对每一个数求出至少要加多少才能使这个数大于剩下两个数。

多测。

限制:\(0\leq a,b,c\leq 10^9,1\leq t\leq 10^4\)

Solution

设最大值为 \(\text{mx}\),如果这个数是最大值且唯一,则答案为 \(0\),若不唯一,则答案为 \(1\),如果不是最大值,设其为 \(p\),则需要加上 \(\text{mx} - p+1\)。

时间复杂度:\(\mathcal O(t)\)

B. Make it Divisible by 25

Type:#OI Problem

Algorithm:#Brute Force

Source:#https://codeforces.com/contest/1593/submission/131928615

Task

给定整数 \(n\),求出最少删去其中的几个数能使 \(n\) 被 \(25\) 整除(不含前导 \(0\),即如果给 \(2005\) 删去 \(2\) 会变成 \(5\))。

数据保证有解,多测。

限制:\(25\le n\le 10^{18},1\le t\le 10^4\)。

Solution

考虑一个数能被 \(25\) 整除,当且仅当它的后两位数为 \(25,50,75,00\),所以我们可以枚举是否出现这样的两位数(注意这里的两位数是需要有序的,其实很好想,你不可能把 \(5,2\) 调换位置)。

时间复杂度:\(\mathcal O(t\log^2n)\)

C. Save More Mice

Type:#OI Problem

Algorithm:#Greedy

Source:#https://codeforces.com/contest/1593/submission/131928753

Task

有一个长为 \(n+1\) 的数轴,猫在 \(0\) 号位置,洞在 \(n\) 号位置,有 \(k\) 只老鼠在猫和洞之间,第 \(i\) 只坐标为 \(x_i\)。

每一秒你可以选择一只老鼠向右移动一格,然后猫将移动一格。

如果猫和老鼠同格,那么猫会吃掉老鼠。

最大化到达洞的老鼠数量。

多测。

限制:\(2\le n\le 10^9\),\(1\le k,\sum k\le 4\times 10^5\),\(1\le t\le 10^4\)

Solution

容易发现老鼠走的步数一定小于猫的步数,那么考虑贪心,即先送离洞最近的老鼠,然后送次近的……

容易发现当走的步数和 \(\gt n\) 的时候,剩下的老鼠便葬身猫围了,答案即为当前循环到的下标 \(-1\)。

时间复杂度:\(\mathcal O(k\log k)\)(单次)

D1. All are Same

Type:#OI Problem

Algorithm:#Euclid Algorithm

Source:#https://codeforces.com/contest/1593/submission/131822562

Task

给定 \(n\) 个数,最大化 \(k\),使得 \(a_1+p_1\times k=a_2+p_2\times k=\cdots=a_n+p_n\times k\)。

多测。

限制:\(1\le n\le 40\),\(1\le \sum n\le 100\),\(-10^6\le a_i\le 10^6\)

Solution

容易发现满足若 \(k\) 满足条件,则这 \(n\) 个数在 \(\bmod k\) 意义下同余。

则答案为 \(\gcd(a_2-a_1,a_3-a_2,a_4-a_3,\cdots,a_n-a_{n-1})\)

时间复杂度:\(\mathcal O(n\log V)\)(单次)

D2. Half of Same

Type:#OI Problem

Algorithm:#Brute Force

Source:#https://codeforces.com/contest/1593/submission/131935927

Task

给定 \(n\) 个数,最大化 \(k\),满足 \(a_1+p_1\times k=a_2+p_2\times k=\cdots=a_m+p_m\times k(m\ge\dfrac n 2)\),这里的 \(a\) 可以任意排列。

多测。

限制:\(1\le n\le 40\),\(1\le \sum n\le 100\),\(-10^6\le a_i\le 10^6\)

Solution

借助 D1 的结论,其实就是在 \(\bmod k\) 下同余,暴力枚举 \(k\) 即可,为了避免处理负数,可以同时加上 \(V\)(值域)。

时间复杂度:\(\mathcal O(nV)\)

E. Gardener and Tree

Type:#OI Problem

Algorithm:#Breadth First Search

Source:#https://codeforces.com/contest/1593/submission/131847135

Task

给定一棵 \(n\) 个点的无根树,每次操作会删掉所有的叶子节点,求 \(k\) 次操作后剩下的结点个数。

多测。

限制:\(1\le n,\sum n\le 4\times10^5\),\(1\le k\le 2\times 10^5\),\(1\le t\le 10^4\)

Solution

考虑 bfs,将一开始的叶子节点深度设为 \(1\),然后进行 bfs 搜深度,第一次搜到这个点一次减一次这个点的度数,将入度为 \(0\) 的点入队并赋深度,最后深度 \(\gt k\) 的点就会留下。

时间复杂度:\(\mathcal O(\sum n)\)

F. Red-Black Number

Type:#OI Problem

Algorithm:#

Source:#

Task

给定 \(n\) 个数字,你需要将其中的一些数染成红色,一些染成黑色,使得红色数字拼接起来能被 \(A\) 整除,黑色数字拼接起来能被 \(B\) 整除,最小化染成红色的数字个数与染成黑色的数字个数的差。

限制:\(1\le n,A,B\le 40\)

G. Changing Brackets

Type:#OI Problem

Algorithm:#Prefix Sum

Source:#https://codeforces.com/contest/1593/submission/131962519

Task

给一个长度为 \(n\) 的由 [ ] ( ) 组成的括号序列 \(s\),\(q\) 次询问,每次询问包含两个参数 l r,问最少花费多少价值能将 \(s[l...r]\) 变成匹配括号串。

你允许进行如下两种操作:

  1. [] 变成 ][,或是将 () 变成 )(,这种操作花费为 \(0\)。
  2. ] 变成 ),或是将 [ 变成 (,这种操作花费为 \(1\)。

多测,询问之间互相独立。

限制:\(1\leq n,\sum n\leq 10^6\),\(1\leq q,\sum q\leq 2\times 10^5\)

Solution

我们要思考怎样让尽量少的 [] 被转换成 (),考虑两个 [] 能够匹配的条件——这两个括号中间有偶数个括号。

也就是说这两个括号的奇偶性一定不同。

设 \(\text{odd}_{l,r}\) 为 $ s[l...r] $ 中中括号在奇数位置的个数,\(\text{even}_i\) ,则需为 $ s[l...r] $ 中中括号在偶数位置的个数,则要被变为圆括号的中括号个数即为:\(\text{abs}(\text{odd}_{l,r}-\text{even}_{l,r})\),可以用前缀和优化。

上一篇:[AHOI2009]中国象棋 题解


下一篇:矩阵论 - 10 - 四个基本子空间