Codeforces Round #580 (Div. 2)
A
取两个最大值即可。
B
正数全部转化到1;负数的话尽可能的转化到-1,必要的时候用0补,实在不行分一个去1。
C
根据求和公式知道偶数肯定是不可以满足题意的,下面我们就大胆地猜测奇数全部都可以,并且考虑如何构造出一个可能的结果。
可以注意到的是,a[i]与a[i + n]的差值肯定是1,不妨把第一位放1,第n + 1位放2,这样子之后前半圈比后半圈少1,那么第二轮操作就把n + 2位放3, 第二位放4…如此反复操作即可得到一种可能的构造结果。
事实上,我第一次没有看出来,打表后才发现这种规律
不过这种构造办法在以前学数竞的时候见过!我印象极为深刻!
D
1205B - Shortest Cycle
题解如上。
其实看到位运算的时候就想到了拆成一位位来处理,这样子时间复杂度1e5 * 64也是恰好可以接受的。不过当时太着迷于在每一位之间进行数字的连线、穿梭成环,却忽视了一个非常important的事情:如果在某一位出现了3个1,那么就已经可以形成一个最小环了!(很容易就可以想到啊…但是为什么我当时。。。)
那么我们只要扫一遍所有的位,如果出现了3个1,那么就可以组成一个最小环。不然,每一位最多只有一条边,一共最多有60条边。因为这是一个稀疏图,我们基于边做一个成环搜索的办法:对于每一条边,端点分别为u和v,如果删去这条边后,u和v还是联通的,那么自然是有两条路径,也就是成环了,把该路径的长度加1就是环的长度。
AC代码 Submission #59075586
CF的题解都是画龙点睛的提示…实际写的话…其实还是有一些小坑的。
在AC之前wa了两发,一发是因为bfs记录最短路的时候多此一举取了一个min,第二发因为没有注意到重边的处理与每次bfs前都要初始化(其实更确切的是…没有把初始化的代码放在循环里面…)对于重边的处理,我们用一个set记录边就可以了,最后范围for语句遍历set数组添加边就可以了。
比较麻烦的是,设置了两个vis数组,一个用来记录边的访问情况来bfs,另一个记录点的最短路径。不过最短路径应该叫做dis数组而不是vis数组?