CF333E Summer Earnings
CF333E Summer Earnings
题目
https://codeforces.com/problemset/problem/333/E
题解
思路
知识点:枚举,图论,位运算。
题目要求从给定的坐标中的选取三个点为圆心,画出 \(3\) 个不相交且半径相等的圆,并求圆半径可能的最大值。
显然,题目可以转化为,任选三个点,找到构成三角形最短边长的 \(1/2\) 中的最大值,直接枚举三个点的复杂度是 \(O(n^3)\) 是不行的。
考虑不从找点角度构成三角形,因为没有操作空间,而先预处理出边端点序号和边长信息记录到边结构体中,复杂度是 \(O(n^2)\) ,从找边角度去构成三角形。但单纯找边也是 \(O(n^3)\) ,需要优化。
既然要找到最长边,可以考虑先把边长从大到小排序,从长边到短边开始找,这样找到第一条能和已经遍历过的较长边构成三角的边就是最大的边。
每次处理一个边,将会记录边对应两个端点的互连的信息,表示这条边已枚举,这里可以给点结构体增设一个 \(bitset\) 变量 \(bs\),\(bs[i]\) 表示为这个点是否已与 \(i\) 号点相连,用 \(bitset\) 类型而不用 \(bool\) 数组主要考虑到空间问题和位运算便捷的操作。
最后找到一条边,能和已经枚举的较长边互连成三角形,这条边边长的 \(1/2\) 即是答案。若要构成三角形,则这条边两个端点的有一个相同的连接点,而通过两个端点各自 \(bs\) 进行 \(\&\) 运算的结果可以得到两端点是否连接了同一个点。
时间复杂度 \(O(n^2 \log n)\)
空间复杂度 \(O(n^2)\)
代码
#include <bits/stdc++.h>
using namespace std;
struct dot{
int x,y;
bitset<3007> bs;
}d[3007];
struct len_dot{
int len,a,b;
}ld[3000*3000+7];
int cnt = 0;
int dist2(int a,int b){
return (d[a].x - d[b].x)*(d[a].x - d[b].x) + (d[a].y - d[b].y)*(d[a].y - d[b].y);
}
bool cmp(len_dot a,len_dot b){
return a.len>b.len;
}
int main(){
int n;
cin>>n;
for(int i = 0;i<n;i++){
cin>>d[i].x>>d[i].y;
}
for(int i = 0;i<n;i++){
for(int j = i+1;j<n;j++){
ld[cnt].len = dist2(i,j);
ld[cnt].a = i;
ld[cnt].b = j;
cnt++;
}
}
sort(ld,ld+cnt,cmp);
double ans;
for(int i = 0;i<cnt;i++){
if((d[ld[i].a].bs & d[ld[i].b].bs).any()){
ans = sqrt(ld[i].len)/2;
break;
}
d[ld[i].a].bs[ld[i].b] = 1;
d[ld[i].b].bs[ld[i].a] = 1;
}
cout<<fixed<<ans<<'\n';
return 0;
}
CF333E Summer Earnings的更多相关文章
- CF习题集二
CF习题集二 一.CF507E Breaking Good 题目描述 \(Breaking Good\)这个游戏对于有经验的玩家来说也有一定的难度. 游戏的主角小明希望加入一个叫斧头帮的犯罪团伙.这个 ...
- Codeforces 333E Summer Earnings(bitset)
题目链接 Summer Earnings 类似MST_Kruskal的做法,连边后sort. 然后对于每条边,依次处理下来,当发现存在三角形时即停止.(具体细节见代码) 答案即为发现三角形时当前所在边 ...
- codeforces Summer Earnings(bieset)
Summer Earnings time limit per test 9 seconds memory limit per test 256 megabytes input standard inp ...
- Codeforces 333E Summer Earnings - bitset
题目传送门 传送门I 传送门II 传送门III 题目大意 给定平面上的$n$个点,以三个不同点为圆心画圆,使得圆两两没有公共部分(相切不算),问最大的半径. 显然答案是三点间任意两点之间的距离的最小值 ...
- [Machine Learning][The Analytics Edge][Predicting Earnings from Census Data]
census = read.csv("census.csv")library(caTools)set.seed(2000)spl = sample.split(census$ove ...
- CodeForces 333E. Summer Earnings
time limit per test 9 seconds memory limit per test 256 megabytes input standard input output standa ...
- Codeforces 333E Summer Earnings ——Bitset
[题目分析] 找一个边长最大的三元环. 把边排序,然后依次加入.加入(i,j)时,把i和j取一个交集,看看是否存在,存在就找到了最大的三元环. 输出即可,n^3/64水过. [代码] #include ...
- Money, save or spend, this is a problem .
Win a lottery? Had a great hand at the casino? Did fortune shine upon you in the stock market? 彩票中了大 ...
- 做Adsense的一些经验
The payment you receive per click depends on how much advertisers are paying per click to advertise ...
随机推荐
- IO ——字节流
什么是流? 概念:内存与存储设备之间传输数据的通道.程序运行后保存在内存,文件一般在硬盘中,在程序中读写文件,需要在内存和存储设备中建立通道.数据借助流传输 流的分类: 按流向: 输入流:将存储设备中 ...
- Python中的Super详解
这篇文章我们来介绍一下 super,我相信大部分的人使用 super 都是使用这种方式: # 就是我有一个 class 比如说是 Male,然后继承另外一个 class 比如是 Person,然后我在 ...
- AOT和单文件发布对程序性能的影响
前言 这里先和大家介绍一下.NET一些发布的历史,以前的.NET框架原生并不支持最终编译结果的单文件发布(需要依赖第三方工具),我这里新建了一个简单的ASP.NET Core项目,发布以后的目录就会像 ...
- Ansible Notes: Tower Credential的本质
Ansible AWX/Tower credential 的本质 Ansible Tower (社区版本叫AWX)用credential这个资源来对象来存储playbook运行过程中用到的机密信息.比 ...
- zookeeper篇-zoo.cfg配置
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. zoo.cfg即/usr/local/java/zookeeper/co ...
- Python 函数进阶-递归函数
递归函数 什么是递归函数 如果一个函数,可以自己调用自己,那么这个函数就是一个递归函数. 递归,递就是去,归就是回,递归就是一去一回的过程. 递归函数的条件 一般来说,递归需要边界条件,整个递归的结构 ...
- Java 16 新特性:instanceof增强
instanceof这个关键词,主要用来判断某个对象是不是某个类的实例. 比如,有时候我们要处理一个类似这样的数据集: Map<String, Object> data = new Has ...
- 『现学现忘』Git基础 — 22、Git中文件重命名
目录 1.用学过的命令进行文件重命名 2.使用git mv命令进行文件重命名 我们这篇文章来说说在Git中如何进行文件重命名. 提示一下,下面所说明的是对已经被Git管理的文件进行重命名,未被Git追 ...
- .Net 6 WebApi 项目部署到 Linux 系统上的 Docker 容器
1.创建一个基础的WebApi项目 注意:因为发布时候,Dockerfile文件必须和解决方案.cspro文件放在同级,所以建议勾上这个,当时遇到这个问题,导致打包镜像时找不到.cspro文件,搞了好 ...
- 每天一个 HTTP 状态码 103
103 Early Hints 103 Earyly Hints 是被用于在最终 HTTP 消息前返回一些响应头,常和 HTTP Header: Link 一起使用,让客户端在服务器还在准备(当前的这 ...