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的更多相关文章

  1. CF习题集二

    CF习题集二 一.CF507E Breaking Good 题目描述 \(Breaking Good\)这个游戏对于有经验的玩家来说也有一定的难度. 游戏的主角小明希望加入一个叫斧头帮的犯罪团伙.这个 ...

  2. Codeforces 333E Summer Earnings(bitset)

    题目链接 Summer Earnings 类似MST_Kruskal的做法,连边后sort. 然后对于每条边,依次处理下来,当发现存在三角形时即停止.(具体细节见代码) 答案即为发现三角形时当前所在边 ...

  3. codeforces Summer Earnings(bieset)

    Summer Earnings time limit per test 9 seconds memory limit per test 256 megabytes input standard inp ...

  4. Codeforces 333E Summer Earnings - bitset

    题目传送门 传送门I 传送门II 传送门III 题目大意 给定平面上的$n$个点,以三个不同点为圆心画圆,使得圆两两没有公共部分(相切不算),问最大的半径. 显然答案是三点间任意两点之间的距离的最小值 ...

  5. [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 ...

  6. CodeForces 333E. Summer Earnings

    time limit per test 9 seconds memory limit per test 256 megabytes input standard input output standa ...

  7. Codeforces 333E Summer Earnings ——Bitset

    [题目分析] 找一个边长最大的三元环. 把边排序,然后依次加入.加入(i,j)时,把i和j取一个交集,看看是否存在,存在就找到了最大的三元环. 输出即可,n^3/64水过. [代码] #include ...

  8. 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? 彩票中了大 ...

  9. 做Adsense的一些经验

    The payment you receive per click depends on how much advertisers are paying per click to advertise ...

随机推荐

  1. 2021.07.19 BZOJ2654 tree(生成树)

    2021.07.19 BZOJ2654 tree(生成树) tree - 黑暗爆炸 2654 - Virtual Judge (vjudge.net) 重点: 1.生成树的本质 2.二分 题意: 有一 ...

  2. 应用程序application和库工程library之间的切换

    知识点: Application作为应用程序启动:apply plugin: 'com.android.application' Library作为库工程被引用: apply plugin: 'com ...

  3. python基础练习题(暂停一秒输出,并格式化当前时间)

    day5 --------------------------------------------------------------- 实例010:给人看的时间 题目 暂停一秒输出,并格式化当前时间 ...

  4. HTTP:聊一聊HTTPS

    一.什么是https https是http的升级,因为http是明文传输的,所以非常不安全,https在http的基础上进行了数据加密. 二.https的加密方式 1.对称加密 服务端会给客户端发送一 ...

  5. JS_简单的效果-鼠标移动、点击、定位元素、修改颜色等

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  6. Http GET 请求参数中文乱码

    两种解决方式 第1种:代码里转换 String name = request.getParamter("name"); String nameUtf8 = new String(n ...

  7. SpringBoot详解

    1.Hello,World! 1.1.SpringBoot简介 回顾什么是Spring Spring是一个开源框架,2003 年兴起的一个轻量级的Java 开发框架,作者:Rod Johnson . ...

  8. Java学习笔记-基础语法Ⅴ

    学习一些Java常用的API Math:包含执行基本数字运算的方法 如果没有构造方法,一般类的成员都是静态的,通过类名可以直接调用 Java中有两种random函数,Math.Random()函数能够 ...

  9. Windows IDEA Community 报错

    运行时报错 "CreateProcess error=206,文件名或扩展名太长" 解决方法:https://plugins.gradle.org/plugin/ua.eshepe ...

  10. Linux磁盘和文件系统知识总结

    硬盘操作 为什么要给硬盘分区? 如果你需要在一块硬盘上用到多个文件系统,那么你就需要对硬盘进行分区,以便用不同的分区支持不同的文件系统.(但一个硬盘只能有一个分区表!)反过来说,如果你整块硬盘都用同样 ...