并查集 + 二分

我是 并查集 + 二分 做的QVQ

思路:两两枚举点之间的距离,sort排序,使距离有序。二分答案,每次判断是否符合条件,然后缩小查询范围,直到满足题目要求(保留2位小数精度就为 0.001就好了)最后保留两位小数输出

核心 判断是否符合条件:

对于每次判断,首先应初始化并查集。因为距离有序,一直并集直到两点距离大于(要判断的)k的两倍(k为每次二分检查的半径,两点距离大于半径即两点相离)为止。

(现在所有距离小于k*2 都被联通了)两两枚举所有点,若有一点i离左海岸线的距离<k,说明点i在半径为k的条件下能够到左边界;同理,若有一点j离右海岸线的距离 + k > len说明点j在半径为k的条件下够得到右边界,如果i,j在同一集合内,说明成立(左边界->i->j->右边界;满足封锁)

需要注意的是:

并查集初始化需从0开始(读题);

每次判断成立都要初始化并查集;

代码如下(注释并上):

    #include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
const int maxn = 1001100;
int num,nr;//点数,边数
int len;//海滩宽度
int father[maxn];//并查集
struct R{
int u,v;
double dis;
}I[maxn];//边
struct Node{
int x,y;
}N[maxn];//点
bool cmp(R a,R b){
return a.dis < b.dis;//sort的cmp函数
}
int findfather(int v){//查找祖先(注意压缩路径【不然也许会超时QAQ】)
if(father[v] == v)return v;
int F = findfather(father[v]);
father[v] = F;
return F;
}
void Union(int a,int b){//并集
int faA = findfather(a);
int faB = findfather(b);
if(faA != faB){
father[faA] = faB;
}
}
bool check(double k){//判断函数
for(int i = 0;i < num;i++)father[i] = i;//并查集每次初始化
int i = 1;
while(I[i].dis <= 2 * k && i <= nr){//在当前k下能连通的全部连通
Union(I[i].u,I[i].v);
i++;
}
for(int i = 0;i < num;i++){//两两枚举
for(int j = 0;j < num;j++){
if(findfather(i) == findfather(j) && N[i].x - k < 0 && N[j].x + k > len){
return 1;
}
}
}
return 0;
}
double search(double l,double r){
while(l + 0.001 < r){//二分,精度为0.001
double mid = (l + r)/2;
if(check(mid)){//成立就缩小上界
r = mid;
}
else{
l = mid;
}
}
return r;
}
int main(){
cin>>len>>num;//输入宽度和点数
for(int i = 0;i < num;i++)father[i] = i;//并查集初始化
for(int i = 0;i < num;i++){
cin>>N[i].x>>N[i].y;//输入点坐标
}
for(int i = 0;i < num;i++){//两两枚举,计算点与点之间的距离
for(int j = i;j < num;j++){
I[++nr].u = i;
I[nr].v = j;
I[nr].dis =sqrt (1.0 * (N[i].x - N[j].x) * (N[i].x - N[j].x) + (N[i].y - N[j].y) * (N[i].y - N[j].y));//记得加math头文件
}
}
sort(I + 1,I + nr + 1,cmp);//按距离从小到大排序
printf("%.2f\n",search(0.0,10000000.0) );//输出
return 0;
}
End.(求过)

P1783 二分并查集写法的更多相关文章

  1. 洛谷:P1783 海滩防御(二分+并查集 最短路 最小生成树)

    题意: 给定长度为N的海滩,然后有M做防御塔,给出每座塔的位置Xi,到海岸的距离Yi. 求防御塔上最小观测半径Ri,使得海滩被封锁. 思路:要使左边界和右边界连通. 很nice,可以二分+并查集做. ...

  2. POJ2349二分+并查集,类似最小树的贪心

    题意:       给你n个点,你的任务是构建一颗通讯树,然后给你一个s表示可以选出来s个点两两通讯不花钱,就是费用是0,其他的费用就是两点的距离,有个要求就是其他的费用中最大的那个最小. 思路:   ...

  3. HDU 3081 Marriage Match II (网络流,最大流,二分,并查集)

    HDU 3081 Marriage Match II (网络流,最大流,二分,并查集) Description Presumably, you all have known the question ...

  4. 洛谷P2498 [SDOI2012]拯救小云公主 【二分 + 并查集】

    题目 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意识到自己还是等级1 ...

  5. 【BZOJ 1594】 [Usaco2008 Jan]猜数游戏 (二分+并查集)

    1594: [Usaco2008 Jan]猜数游戏 Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在牛棚后面 ...

  6. bzoj 1196: [HNOI2006]公路修建问题 二分+并查集

    题目链接 1196: [HNOI2006]公路修建问题 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1576  Solved: 909[Submit ...

  7. hdu3081 Marriage Match II(二分+并查集+最大流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3081 题意: n个女生与n个男生配对,每个女生只能配对某些男生,有些女生相互是朋友,每个女生也可以跟她 ...

  8. 2018.11.02 NOIP模拟 飞越行星带(最小生成树/二分+并查集)

    传送门 发现题目要求的就是从下到上的瓶颈路. 画个图出来发现跟去年noipnoipnoip提高组的奶酪差不多. 于是可以二分宽度+并查集检验,或者直接求瓶颈. 代码

  9. 二分+并查集【bzoj3007】[SDOI2012]拯救小云公主

    Description 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意 ...

随机推荐

  1. 冲刺One之站立会议6 /2015-5-19

    2015-5-19 今天把服务器端的界面完善了一下,然后大家查了好多资料,实现了登陆界面实际连接的功能,开始加了一个它和服务器的的跳转,但是分析过后发现这是个没有必要的跳转.登录应该直接转到聊天室的主 ...

  2. linux 常用命令-ps命令

    ps(process status):进程状态相关命令 1.

  3. beat冲刺(4/7)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(4/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 整理博客 ppt模板 接下来的计划 做好机动. ...

  4. Beta Scrum Day 6 — 听说

    听说

  5. Python对list去重

    Python对list去重 方法一 新建新的列表,利用not in命令去重.这种方法看起来不够简便,但是保留了原列表中的顺序.代码如下: list1 = [1,2,3,4,1,1,2,5,4,3] l ...

  6. NABCD(校园包车)

    广州商学院包车 N(need) 各个高校包车需求量大,然而校园内包车信息太散乱,售票地点不确定,有些老师.学生特别是新生,甚至不知有校园包车这一回事, 随着信息网络的发展,为了给师生带来校园更多的方便 ...

  7. 【贪心算法】POJ-1017

    一.题目 Description A factory produces products packed in square packets of the same height h and of th ...

  8. 【搜索】POJ-3669 BFS

    一.题目 Description Bessie hears that an extraordinary meteor shower is coming; reports say that these ...

  9. 读书笔记-《Java核心技术卷I-基础知识》

    1.定时器Timer类 构造定时器时,需要设置一个时间间隔,并告知定时器,当到达时间间隔时需要做什么操作.定时器需要知道调用哪一个方法,并要求传递的对象所属的类实现了java.awt.event包的A ...

  10. linux_添加定时任务,每5min清理下某个文件夹下的文件

    性能测试的过程中会生成大量的日志文件,导致无法继续进行,linux可以增加一个定时任务,进行定时清理 1. 先编写一个sh脚本,该sh脚本用于文件夹文件清理,脚本编写完成后拷贝到服务器上,且授予权限 ...