Codeforces Round #580 (Div. 2) A - D

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数组?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值