并查集 + 二分

我是 并查集 + 二分 做的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. Scrum Meeting 11.03

    成员 今日任务 明日计划 用时 徐越 休息     赵庶宏 编写功能说明书,servlet代码移植 servlet代码移植 3h 薄霖 阅读上一届相关代码,思考改进方法 学习安卓界面设计数据库管理 4 ...

  2. 安卓端通过http对Mysql进行增删改查

    各类it学习视频,大家都可以看看哦!我自己本人都是通过这些来学习it只知识的! 下面是视频链接转自:http://www.cnblogs.com/yzxk/p/4749440.html Android ...

  3. spring冲刺第一天

    第一天总结 昨天我们开始了spring冲刺会议,我们进行了明确的分工,每个人都有自己的任务.我的目前任务是游戏地图的初步设计. 今天早上我们开了站立会议,算是正式开始了spring冲刺.我上网查找了一 ...

  4. HTML和CSS <h1> --3-- <h1>

    标签语义化,让网页更好的被搜索引擎理解 标签的用途:我们学习网页制作时,常常会听到一个词,语义化.那么什么叫做语义化呢,说的通俗点就是:明白每个标签的用途(在什么情况下使用此标签合理)比如,网页上的文 ...

  5. Android笔记-4-实现登陆页面并跳转和简单的注册页面

    实现登陆页面并跳转和简单的注册页面   首先我们来看看布局的xml代码 login.xml <span style="font-family:Arial;font-size:18px; ...

  6. 【CSAPP笔记】3. 浮点数

    回想起刚学C语言时,我对浮点数的印象大概是"能够表示小数"的数据类型.还死记硬背过例如什么"小数用double存,用%f输出"这类的话.实际上呢,浮点数可以用这 ...

  7. 结对项目-四则运算出题程序(GUI版)

    目录: 一.致搭档(含项目地址) 二.PSP(planning) 三.结对编程中对接口的设计 四.计算模块接口的设计与实现过程 五.计算模块接口部分的性能改进 六.计算模块部分单元测试展示 七.计算模 ...

  8. synchronized、锁、多线程同步的原理是咋样

    先综述个结论: 一般说的synchronized用来做多线程同步功能,其实synchronized只是提供多线程互斥,而对象的wait()和notify()方法才提供线程的同步功能. 一般说synch ...

  9. Linux服务器学习(二)

    昨天简单了解了linux的基础命令,今天学习linux搭建环境(安装文件,配置文件)及权限操作. 一.搭建lnmp环境 lnmp指Linux+Nginx+Mysql+PHP Ubuntu安装文件命令为 ...

  10. C 语言assert使用

    1.assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include <assert.h>void assert( i ...