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 ...
随机推荐
- windows批处理执行图片爬取脚本
背景 由于测试时需要上传一些图片,而自己保存的图片很少. 为了让测试数据看起来不那么重复,所以网上找了一个爬虫脚本,以下是源码: 1 import requests 2 import os 3 4 c ...
- Vue2响应式原理
vue2响应式原理 vue的特性:数据驱动视图和双向数据绑定.vue官方文档也提供了响应式原理的解释: 深入响应式原理 Object.defineProperty() Object.definePro ...
- WMS、WFS、WCS、WPS、WMTS、WMSC、TMS等常见地图服务的区别
WebGIS的开发者经常需要面对各种地图服务规范,例如WMS.WFS.WCS.WPS.WMTS.TMS.WMSC等.因此了解这些服务的内容是相当重要的,这里对常见的服务进行了整理. OGC联盟: 开放 ...
- 新华三Gen10服务器进SSA查看、配置阵列
1.开机自检进F10 2.F10后选择[smart storage administrator](跳到第5步)或选择第一项IP[intelligent provisioning] 3.选择执行维护 4 ...
- SmartIDE v0.1.16 已经发布 - 支持阿里&蚂蚁开源的国产 IDE OpenSumi
SmartIDE v0.1.16 (Build 3137) 已经在2022年4月19日发布到稳定版通道,我们在这个版本中增加了阿里和蚂蚁发布的国产IDE OpenSumi的支持,以及其他一些改进.Sm ...
- Shell 脚本编程最佳实践
前言 由于工作需要,最近重新开始拾掇shell脚本.虽然绝大部分命令自己平时也经常使用,但是在写成脚本的时候总觉得写的很难看.而且当我在看其他人写的脚本的时候,总觉得难以阅读.毕竟shell脚本这个东 ...
- DOM0级同DOM2级
DOM0级分为两个:一是写在标签内的onclick事件: <button id="btn" onclick="alert('happy')">按钮& ...
- Spring Authorization Server 实现授权中心
Spring Authorization Server 实现授权中心 源码地址 当前,Spring Security 对 OAuth 2.0 框架提供了全面的支持.Spring Authorizati ...
- Python-100-Days-master
跟着python100学习一下 100以内的素数 # 输出100以内的所有素数 # 想法:从1到100遍历,假设得到了i=17,那么此时从1到9遍历,如果找到了一个数用17能除尽则跳出循环 # 如果找 ...
- CSAPP 之 CacheLab 详解
前言 本篇博客将会介绍 CSAPP 之 CacheLab 的解题过程,分为 Part A 和 Part B 两个部分,其中 Part A 要求使用代码模拟一个高速缓存存储器,Part B 要求优化矩阵 ...