杂题选做Ⅴ


前传:

101. CF1354G Find a Gift

首先考虑我们假如知道某个盒子里是石头怎么求解答案。考虑倍增,具体来说我们先假设第一个盒子里是石头,否则直接返回 \(1\) 即可。那么我们第一次拿 \(1\)\(2\) 比较,如果不相等说明 \(2\) 是礼物,否则说明 \(1,2\) 都是石头,我们再拿 \(1,2\)\(3,4\) 比较,如果不相等则说明 \(3,4\) 中有礼物,否则说明 \(1\sim 4\) 都是石头,我们继续比较 \(1,2,3,4\)\(5,6,7,8\),以此类推。这样我们可以求出一个 \(k\),使得第一个装有礼物的盒子在 \(2^{k-1}+1\)\(2^k\) 之间,然后再二分即可。这样询问次数上界为 \(2\log n\)

接下来考虑如何求出一个装有石头的盒子。直接做看起来不太容易,不过注意到题目中“\(k>\dfrac{n}{2}\)”的条件,这意味着我们可以考虑随机化。我们考虑找到一个局部重量最大的盒子 \(x\),初始 \(x=1\),然后每次随机一个盒子 \(y\) 并比较 \(x,y\) 的重量,如果 \(y\) 的重量大于 \(x\) 那么令 \(x\) 等于 \(y\),如此随机 \(T\) 次之后出错的概率就降到了 \(\dfrac{1}{2^T}\),取 \(T=20\) 就差不多了。

102. CF1355F Guess Divisors Count

一道非常奇怪的乱搞题。

首先看到这个“\(|X-Y|\le 7\)\(\dfrac{X}{Y}\in[\dfrac{1}{2},2]\)就算正确“,我们不禁可以往乱搞的方向思考。我们先考虑一个非常naive 的乱搞:考虑前 \(22\) 个质数。对于每个质数 \(p_i\) 我们找到满足 \(p_i^x\le 10^{18}\) 的最大的 \(x\),这样我们可以得到 \(N\) 的质因数分解形式中,前 22 个质数的次数。然后假设 \(D\) 表示现在已经确定的因子个数,那么我们输出 \(\max(2D,D+7)\) 即可。但是这样显然不能通过,碰到像 \(N=2^3·101·103·107·109\) 这样的数据就炸了。因此考虑魔改我们的算法,我们设一个阈值 \(B\),然后每 \(B\) 个质数一组批量询问,具体来说对于连续的 \(B\) 个质数 \(p_{i_1},p_{i_2},\cdots,p_{i_B}\),我们找到满足 \(p_{i_k}^x\le\sqrt[B]{10^{18}}\) 的最大的 \(x\),然后将这些 \(p_{i_k}^x\) 乘起来,这样我们可以大致知道这些质数的次数,然后再输出对应的 \(\max(2D,D+7)\) 即可。感性理解一下这样获得正确答案的概率肯定是比前一个算法高不少的,该算法进而也能通过此题。

103. CF1325E Ehab's REAL Number Theory Problem

首先先特判掉输入的 \(n\) 个数中就包含完全平方数的情况。由于每个数最多包含 \(7\) 个因子,因此我们将每个数分解质因数后将每个质因子的次数 \(\bmod 2\) 之后肯定要么形如 \(p\),要么形如 \(p\times q\),其中 \(p,q\) 均为质数。而一个乘积是完全平方数的序列,就形如 \(p_1,p_1\times p_2,p_2\times p_3,p_3\times p_4,\cdots,p_{k-1}\times p_k,p_k\),要么形如 \(p_1\times p_2,p_2\times p_3,\cdots,p_{k-1}\times p_k,p_k\times p_1\)

我们考虑将其往图论模型的方向转化。我们建立一个虚点 \(P\),如果一个 \(a_i\) 只有一个质因子 \(p\),那么我们就连一条 \(P\)\(p\) 之间的无向边,否则 \(a_i\) 有两个质因子 \(p,q\),我们就连一条 \(p\)\(q\) 之间的边,容易发现建出来的这张图中的最小环就是答案。

直接做是平方的显然会 TLE,不过注意到原题的图不同于一般图的一个地方:两个 \(>10^3\)​ 的质因子之间不会连边,也就是说符合要求的最小环不可能只由 \(>10^3\) 的点组成,因此我们只用以 \(<10^3\) 的质因数以及 \(P\) 为源点跑一下 BFS 求最小环然后取 \(\min\) 即可,时间复杂度 \(n\pi(\sqrt{a_i})\)

最后提一下 BFS 求最小环的方法:考虑钦定一个源点 \(s\),然后 BFS 一遍得到 \(s\) 到每个点的最短距离 \(d_x\),然后当 BFS 到某个 \(x\) 时,我们如果访问到他的一个邻居 \(y\)\(d_y\) 已经求得,那么我们就用 \(d_x+d_y+1\) 更新答案,虽然 \(s\to x\) 的路径与 \(s\to y\) 有可能会有重叠,但是有重叠时的答案肯定比没有重叠的答案来得劣,并且更优的答案肯定会在接下来的 BFS 过程中被考虑到,这也就说明了该算法的正确性。

104. CF1305F Kuroni and the Punishment

考虑一个浅显的性质:答案不超过 \(n\),因为我们肯定可以花费不超过 \(n\) 的代价将每个数都变成 \(2\) 的倍数。思考一下这意味着什么,我们假设变换得到的序列为 \(\{b_n\}\),那么由于最优策略下需要花费的代价不超过 \(n\),因此满足 \(|b_i-a_i|\ge 2\)\(i\) 的个数不超过 \(\dfrac{n}{2}\)。这样一来,问题就长得一脸 杭电多校 2021 第 10 场,integers have friends 2.0 的样子了,我们随机一个下标 \(x\) 并强制钦定 \(b_x=a_x-1\),算一遍答案,再强制钦定 \(b_x=a_x,b_x=a_x+1\) 进行一遍同样操作。随机 \(20\) 次以后出错的概率就很小很小了。

105. CF1468L Prime Divisors Selection

我们先考虑将每个数写成 \(p^a\) 的形式,我们定义一个质因子 \(p\) 的“出现次数”为,满足 \(a_i=p^x\)\(i\) 的个数(\(x\in\mathbb{Z}\))。显然如果一个质因子出现次数 \(\le 1\),那么包含这些质因子的数都不能被选择,我们就干脆把这些质因子全部踢出去,这样我们剩下的就只有那些由出现次数 \(\ge 2\) 的质因子构成的数。

显然如果 \(k=1\) 或者 \(k\) 超过了剩余的数的个数那肯定无解了,直接输出 \(0\)。但是如果 \(k\)\(2\) 与剩余的数的个数之间那也有可能出现无解的情况,特例:\(a=[4,8,9,27],k=3\),因此考虑进一步分情况讨论:

  • \(cnt\) 表示出现次数 \(\ge 2\) 的质因子个数,如果 \(k\ge 2cnt\) 那好办,直接在这 \(cnt\) 个质因子中先随便选 \(2\) 个数,然后再随便选 \(k-2cnt\) 个数即可。
  • 否则如果 \(k\)​ 是偶数那也好办,随机选 \(\dfrac{k}{2}\) 个质因子,然后这些质因子中随便选 \(2\) 个对应的数即可。
  • 否则继续分情况讨论,如果存在一个质因子 \(p\)​ 出现次数 \(\ge 3\)​ 那么我们就选 \(3\)​ 个满足可以写成 \(p^x\)​ 的数,然后再随机选另外 \(\dfrac{k-3}{2}\)​ 个质因子,对于选中的质因子 \(p’\),随便选两个数形如 \((p’)^x\) 的数即可。
  • 否则说明所有质因子的出现次数都等于 \(2\),那么我们考虑所有不可以写成 \(p^x\) 且没有被我们踢掉的数,我们记这些数中质因子个数的最小值为 \(M\),那么如果 \(k<2M-1\) 就无解了。否则我们j,再选假设没有被踢掉的数中质因子个数最小的数为 \(v\)\(v\)\(M\) 个质因子为 \(p_1,p_2,\cdots,p_M\),那么我们对于 \(i\in[1,M]\),选出两个形如 \(p_i^x\) 的数,然后选上 \(v\) 这个数,然后再随便选 \(\dfrac{k-2M-1}{2}\) 个剩余的质因子 \(p\),每个质因子选两个形如 \(p^x\) 的数即可。

注意到每个数互不相同,所以只有 \(<10^9\) 的质数是有用的,其他质数的出现次数至多为 \(1\)。而如果我们考虑对 \(1\sim 10^6\) 里的质数暴力分解,这样我们可以对所有 \(\le 10^6\) 的质数 \(p\),找出序列中所有可以表示成 \(p^x\) 的数。而如果 \(a_i\le 10^9\),并且 \(a_i\) 没有 \(\le 10^6\)​ 的质因子,那么就说明 \(a_i\) 是质数,我们只需检验 \(a_i^2\) 是否是一个质数,如果是则说明 \(a_i\) 的出现次数为二,否则我们直接踢掉这个质数即可。

时间复杂度 \(n\pi(10^6)\)

106. CF1307E Cow and Treats

首先考虑一个浅显的性质:对于同一种甜味的草,其最多被两头牛吃,即从左边吃一次,从右边吃一次。

那么不难发现,无论怎么安排,总存在一个断点 \(p\),使得从左边进来的牛到达的位置都在 \(p\) 左边,从右边进来的牛最终到达的位置都在 \(p\) 右边。

因此我们考虑枚举这个断点 \(p\),那么我们需强制要求必须要有一头牛到达 \(p\) 这个位置,否则会算重,这个就预处理 \(sum_{x,y}\) 表示有多少头最喜欢的甜味值为 \(x\),且饥饿值 \(\le y\),再在枚举 \(p\) 的过程中维护一个 \(suml_x\) 表示在 \(p\) 及左边有多少个甜味值为 \(x\) 的草,\(sumr_x\) 表示在 \(p\) 右边有多少个甜味值为 \(x\) 的草,这样我们可以求出有多少头牛从左边进入时恰好能够走到 \(p\),这样我们就确定了最喜欢的甜味值为 \(s_p\),且从左边进入的牛的方案数,接下来考虑从右边进入的牛的方案数,有 \(sum[s_p][sumr_{s_p}]\) 头牛可以从右边进入,但是如果 \(sumr_{s_p}\ge suml_{s_p}\),那么左边至少安排一头牛,所以安排右边进入的甜味值为 \(s_p\) 的牛的方案数就可以用 \(sum[s_p][sumr_{s_p}]-[sumr_{s_p}\ge suml_{s_p}]\),乘法原理计算贡献即可。

接下来考虑计算别的甜味值 \(x\)​ 的贡献,记 \(cntl=sum[x][suml_x],cntr=sum[x][cntr_x]\),还是分情况讨论:

  • 如果 \(cntl=cntr=0\)​,那么不可能有喜欢这种甜味的牛能迟到草,直接跳过这种甜味。
  • 如果 \(cntl=cntr=1\)​,那么只有一头牛能吃到草,且这头牛可以从左边进,也可以从右边进,方案数乘 \(2\)​,牛数加 \(1\)​。
  • 否则有两头牛能吃到草,且安排这两头牛的方案数为 \(cntl\times cntr-\min(cntl,cntr)\),乘法原理计算答案即可。

时间复杂度 \(\mathcal O(nm)\)

107. CF1615F LEGOndary Grandmaster

首先碰到这样的问题,我们肯定要考虑怎样快速对于两个 01 串 \(s,t\),计算从 \(s\)\(t\) 的最少步数。我们考虑这样一个套路化的操作:对于下标为偶数的位置,我们自动将两个字符串上对应的位置都取反,即 \(0\)\(1\)\(1\)\(0\),我们记操作后得到的字符串为 \(s’,t’\)。那么不难发现,将原字符串上两个相邻且值相同的位置取反,等价于交换这两个字符,而对于相邻且值不同的位置,交换它们则等价于什么也没有干,因此我们可以将操作描述为,交换 \(s’\) 中两个相邻的字符,问最少需要多少次操作才能将 \(s’\) 变为 \(t’\)

很显然,\(s’\) 可以变成 \(t’\) 的充要条件是 \(s’,t’\)\(1\) 的个数相同。考虑怎样计算步数。对于一般序列,计算一个序列 \(a\) 变为 \(b\) 的最少交换次数需要计算逆序对进而求解,不过对于 01 序列而言有一个更简便的解法:我们设 \(s’\) 中第 \(i\)\(1\) 的下标为 \(x_i\)\(t’\) 中第 \(i\)\(1\) 的下标为 \(y_i\),那么最少交换次数即为 \(\sum\limits_{i=1}^c|x_i-y_i|\),其中 \(c\)\(s’,t’\)\(1\) 的个数。这个式子看起来已经很简便了,但是应用于此题而言还不足以在 \(\mathcal O(n^2)\) 的时间复杂度内求解,考虑进一步化简。我们设 \(a_i,b_i\) 分别表示 \(s’[1…i]\)\(1\) 的个数以及 \(t’[1…i]\)\(1\) 的个数。那么答案可以进一步写作 \(\sum\limits_{i=1}^n|a_i-b_i|\)。因为由于一次操作至多使 \(|a_i-b_i|\) 减少 \(1\),因此最少需要 \(|a_i-b_i|\) 次操作才能使得 \(a_i=b_i\),因此最少操作次数的下界就是 \(\sum\limits_{i=1}^n|a_i-b_i|\),而显然我们可以通过先通过交换使 \(s’_1=t’_1\),再使 \(s’_2=t’_2\),依次类推……来达到这个下界。

发现这个结论之后就很好 DP 了,记 \(pre_{i,j}\) 表示现在以及确定了 \(s,t\)\(i\) 位的值,\(a_i-b_i=j\) 的方案数,\(suf_{i,j}\) 表示现在已经确定了 \(s,t\)\(n-i+1\) 位的值,后 \(n-i+1\) 位中,\(s’\)\(1\) 的个数与 \(t’\)\(1\) 的个数之差为 \(j\) 的方案数,那么答案即为 \(\sum\limits_{i=1}^n\sum\limits_{j=-n}^npre_{i,j}·suf_{i+1,-j}·|j|\)

时间复杂度 \(n^2\)


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM