CF1280、1281题解
CF1280、1281题解
CF1281A
题意
给定 \(n\) 个字符串,对于每个字符串:
- 若它以
po
结尾,输出FILIPINO
- 若它以
desu
或masu
结尾,输出JAPANESE
- 若它以
mnida
结尾,输出KOREAN
保证所给的字符串一定满足以上的三种情况之一。
分析
if 判断一下字符串的后几位即可。
CF1281B
题意
给定 \(n\) 对字符串,对于每对字符串 \(s\) 和 \(t\),你至多可以交换 \(s\) 中的一对字符,使得 \(s\) 严格小于 \(t\)。若无解,输出 ---
。
分析
暴力枚举 \(s\) 中的两位,交换后看是不是严格小于 \(t\)。
CF1280A
题意
一个字符串 \(s\ (\)下标从 \(1\) 到 \(n)\),和一个变量 \(it\),初始为 \(0\)。要他执行 \(x\) 次操作,求最后的串长度对 \(10^9+7\) 取模的结果。
操作如下:
-
将 \(it+1\)。
-
将剪贴板的内容替换为 \((it,n]\ (n\) 是当前的串的长度 \()\),并在原串中删除 \((it,n]\)。
-
在串的末尾把剪贴板内容粘贴 \(sit\) 次。
保证\(x\leq10^6,\left|s\right|\leq500\)。
分析
容易发现每次操作都是在原串的后面加上一些东西。只有字符串的前 \(x\) 位的具体字符关系到操作,因此只需处理出前 \(x\) 位,字符串的长度可以通过递推得到,即 \(len=(len-i)\times s[i]\)。
CF1280B
题意
有一个 \(n\times m\) 的字符矩阵,每个字符为 A
或 P
。
每次可以选择一行或一列中若干个连续的字符,并将其向另一个方向复制若干列或行,如样例所示。
需要将矩阵的所有字符全部变为 A
,输出最小的操作次数。如果无论如何都不能完成,输出 MORTAL
。
分析
容易看出,原矩阵只有 \(7\) 种情况,分类讨论即可。
-
若字符矩阵全是
P
,则无解; -
若字符矩阵本来就全是
A
,则需要 \(0\) 步操作; -
若原矩阵的第一行或第一列或最后一行或最后一列是
A
,则只需 \(1\) 步操作,即推整行或整列; -
若原矩阵有整行或整列的
A
,且不是在边界的行或列,则需要 \(2\) 步操作,即向两个方向推该行或列; -
若没有整行整列的
A
,但有在四个角的A
,则需要 \(2\) 步操作,即先推完整行,再用行推完整个矩阵; -
若没有整行整列的
A
,也没有四个角的A
,但有在边界的A
,则需要 \(3\) 步操作,即先向两个方向推完整个行或列,再推完整个矩阵。 -
若只有普通的
A
,也就是没有在以上 2-6 情况中的任意一种,则需要 \(4\) 步操作,即向四个方向推。
CF1280C
题意
给一棵有边权树,树上有 \(2\times k\) 个点。
定义 \(G\) 为任意选 \(k\) 组无重复的点(每组点两个点),每组点的距离和的最小值,\(B=\) 任意选k组无重复的点(每组点两个点),每组点的距离和的最大值。求 \(G,B\)。
分析
首先考虑最大值。
每次新增加一条边 \((u,v)\),当它左边的所有点都尽可能地和右边所有点配对时,比原来多了 \(\min(cnt_u,cnt_v)\) 次加上 \((u,v)\) 的权值,此时增加的贡献最大,为 \(\min(cnt_u,cnt_v)\times w\),其中 \(cnt\) 表示子树大小。因此对于整棵树来说,要取到距离和的最大值,就要尽可能地让每一条边左右的点配对,最后答案为每条边的贡献之和。
有了最大值的思想,求最小值就很容易想出来了。
对于一条新边 \((u,v)\) 来说,要想使其贡献尽可能小,就尽可能地让两侧的点尽量与同侧的配对。如果 \(cnt_v\) 为偶数,那么可以完全内部配对,此时 \((u,v)\) 的贡献为 \(0\);当 \(cnt_v\) 为奇数时,\(v\) 侧至少有一个点需要与 \(u\) 配对,那么此时 \((u,v)\) 的贡献为 \(w\)。最后答案为每条边贡献之和。
CF1280D
题意
给一棵有边权树,树上有 \(2\times k\) 个点。
定义 \(G\) 为任意选 \(k\) 组无重复的点(每组点两个点),每组点的距离和的最小值,\(B=\) 任意选k组无重复的点(每组点两个点),每组点的距离和的最大值。求 \(G,B\)。
分析
首先考虑最大值。
每次新增加一条边 \((u,v)\),当它左边的所有点都尽可能地和右边所有点配对时,比原来多了 \(\min(cnt_u,cnt_v)\) 次加上 \((u,v)\) 的权值,此时增加的贡献最大,为 \(\min(cnt_u,cnt_v)\times w\),其中 \(cnt\) 表示子树大小。因此对于整棵树来说,要取到距离和的最大值,就要尽可能地让每一条边左右的点配对,最后答案为每条边的贡献之和。
有了最大值的思想,求最小值就很容易想出来了。
对于一条新边 \((u,v)\) 来说,要想使其贡献尽可能小,就尽可能地让两侧的点尽量与同侧的配对。如果 \(cnt_v\) 为偶数,那么可以完全内部配对,此时 \((u,v)\) 的贡献为 \(0\);当 \(cnt_v\) 为奇数时,\(v\) 侧至少有一个点需要与 \(u\) 配对,那么此时 \((u,v)\) 的贡献为 \(w\)。最后答案为每条边贡献之和。