CF1280、1281题解

CF1280、1281题解

CF1281A

题意

给定 \(n\) 个字符串,对于每个字符串:

  • 若它以 po 结尾,输出 FILIPINO
  • 若它以 desumasu 结尾,输出 JAPANESE
  • 若它以 mnida 结尾,输出 KOREAN
    保证所给的字符串一定满足以上的三种情况之一。

分析

if 判断一下字符串的后几位即可。

CF1281B

题意

给定 \(n\) 对字符串,对于每对字符串 \(s\)\(t\),你至多可以交换 \(s\) 中的一对字符,使得 \(s\) 严格小于 \(t\)。若无解,输出 ---

分析

暴力枚举 \(s\) 中的两位,交换后看是不是严格小于 \(t\)

CF1280A

题意

一个字符串 \(s\ (\)下标从 \(1\)\(n)\),和一个变量 \(it\),初始为 \(0\)。要他执行 \(x\) 次操作,求最后的串长度对 \(10^9+7\) 取模的结果。
操作如下:

  1. \(it+1\)

  2. 将剪贴板的内容替换为 \((it,n]\ (n\) 是当前的串的长度 \()\),并在原串中删除 \((it,n]\)

  3. 在串的末尾把剪贴板内容粘贴 \(sit\) 次。

保证\(x\leq10^6,\left|s\right|\leq500\)

分析

容易发现每次操作都是在原串的后面加上一些东西。只有字符串的前 \(x\) 位的具体字符关系到操作,因此只需处理出前 \(x\) 位,字符串的长度可以通过递推得到,即 \(len=(len-i)\times s[i]\)

CF1280B

题意

有一个 \(n\times m\) 的字符矩阵,每个字符为 AP
每次可以选择一行或一列中若干个连续的字符,并将其向另一个方向复制若干列或行,如样例所示。
需要将矩阵的所有字符全部变为 A,输出最小的操作次数。如果无论如何都不能完成,输出 MORTAL

分析

容易看出,原矩阵只有 \(7\) 种情况,分类讨论即可。

  1. 若字符矩阵全是 P,则无解;

  2. 若字符矩阵本来就全是 A,则需要 \(0\) 步操作;

  3. 若原矩阵的第一行或第一列或最后一行或最后一列是 A,则只需 \(1\) 步操作,即推整行或整列;

  4. 若原矩阵有整行或整列的 A,且不是在边界的行或列,则需要 \(2\) 步操作,即向两个方向推该行或列;

  5. 若没有整行整列的 A,但有在四个角的 A,则需要 \(2\) 步操作,即先推完整行,再用行推完整个矩阵;

  6. 若没有整行整列的 A,也没有四个角的 A,但有在边界的 A,则需要 \(3\) 步操作,即先向两个方向推完整个行或列,再推完整个矩阵。

  7. 若只有普通的 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\)。最后答案为每条边贡献之和。

posted @ 2022-04-29 21:26  l_x_y  阅读(48)  评论(0编辑  收藏  举报