Codeforces Round #385 (Div. 2) ABCD题解

如果说智商有颜色,那我一定是透明的~

快速版题解:
大概就是A题水题;B题勉强算个小模拟,还是水题;C题并查集上统计;D题二分。四道水题,目测算是手速场。

具体版:
A
题意:将字符串最后一个字母拿出来,放到头,称为一次操作。比如abcd进行了一次操作就是dabc。问,能搞出多少个不同的串。(阿弥陀佛,贫道没有读题,看样例看出来的,至于题意对不对,就只能上帝保佑了。)
思路:无
代码:385A

B
题意:就是用.表示虚的,x表示实的,这样他就给你了一个东西,问两个这样的东西能不能拼成一个长方形的东西,当然是包括正方形的。但是拼的时候,只能直接刚,不能旋转啊,翻转啊之类的。
思路:直接扫,看看这个图本身是不是方的。
代码:385B

C
题意:有n个节点,m条无向边。然后n个节点里有k个国家中心节点。然后呢,任何两个国家中心节点之间呢,不能有通路。现在呢,要你随便添边,但是呢,还是要保证没有通路。问你最多能加多少边。比如A到B有边,B到C有边,那么A到C就有通路啦,如果A、C都是国家中心节点,就不行。
思路:并查集,然后你就能得到若干个集合,这些集合要么最多含有一个中心节点,要么就没有中心节点。然后呢有中心节点的集合呢,先在内部全部连一遍,记个数。没有中心节点的全部连到一起,记个数。最后把没有中心节点的集合全部连到某一个有中心节点的集合上,好像要一个一个去试。
代码:385C

D
题意:

  • 这题有点新意。首先会给你输入一个n,告诉你这个矩阵有多大。然后输入就停了,等你输出了点东西,再有输入。比如样例,上手告诉你矩阵是3×3的,然后就没有了,你要去查询。
  • 查询规则如下:
    你先要输出一个k,表示你要查多少列,比如样例一里,你输出的3。然后换行,输出k个数,表示你具体哪些列。然后系统就会回给你每一行,这些列的最小值是多少。
  • 样例解析:别人告诉了你矩阵了,输入了3了,但是不会告诉你矩阵是[[0, 3, 2],[5, 0, 7],[4, 8 ,0],]。现在你输入3,然后1,2,3。然后系统就给你0,0,0。因为每一列都选了,所以每一行最小值都是0。又比如你又进行一次查询,查询2,然后1,2,表示你要查询只考虑每一行的第1、2列的情况下的最小值。那第1行就是min(0,3),第2行就是min(5,0),第3行是min(4,8),所以系统回你0,0,4。
  • 然后呢,题目要你求什么呢?排除对角元(aii)的每行的最小值。但是你的查询最多只能有20次。
  • 然后题干提示你了,你输出一次查询之后,记得刷新,怎么刷新看题目。

思路:

  • 首先呢,得有个二分的直觉。我第一直觉是,先查左半边(1n/2),再查右半边(n/2+1n)。这样呢,原矩阵就等分成了4份,左上角、右下角都有对角元,所以肯定是0,但是呢左下角,右上角的就都查询到了。然后呢,发现左上角,右下角都和原问题一个形式,就能递归形式求解啦。
  • 但是转念一想就发现不对,一层层递归下去,查询次数是n次。人家的n可是1000,但是你最多只能搞20次查询。
  • 然后呢,按这个思路,把查询区间展开一下。比如n=10,按直觉的做法,上手查1-5,然后查6-10。接着展开1-5,查1-3,再查4-5。再展开6-10,查6-8和9-10。然后你就发现其实1-3和6-8可以一起查。
    现在可能还不够明显,我们再展开一层。下一层就是查1-2和3-3(对就查着1列)和4-4和5-5和6-7和8和9和10,然后你就发现1-2、4-4、6-7、9可以一起查,剩下的也是可以一起查。
  • 所以,还是之前二分的直觉,一直拆下去,拆到只查1列的那一层,你就能得到一个二叉树。然后从底往上查,同一层的左儿子一起查,右儿子一起查。相当于每层查两次。
  • 然后你看1024这么拆下来也就10层,每层查2次,刚刚好20次。

代码:385D

E
没看,有生之年争取填坑。

你可能感兴趣的:(Codeforces Round #385 (Div. 2) ABCD题解)