【题目大意】

给n对炸弹可以放置的位置(每个位置为一个二维平面上的点),每次放置炸弹是时只能选择这一对中的其中一个点,每个炸弹爆炸的范围半径都一样,控制爆炸的半径使得所有的爆炸范围都不相交(可以相切),求解这个最大半径。

【思路】

显然是二分答案!二分半径,2-SAT建图部分是最裸的。

【错误点】

注意一下精度啊,HDU根本不提供所谓的±0.01..

一开始写了printf("%.2f\n",floor(ub*100)/100);

事实上写printf("%.2f\n",ub);就好啦。

 #include<bits/stdc++.h>
#define eps 1e-8
using namespace std;
const int MAXN=;
const int INF=0x7fffffff;
int n;
int x[MAXN],y[MAXN];
int dfn[MAXN],low[MAXN],col[MAXN],instack[MAXN],colcnt,cnt;
vector<int> E[MAXN];
stack<int> S; void addedge(int u,int v)
{
E[u].push_back(v);
} double dist(int x1,int y1,int x2,int y2)
{
double ret=sqrt((double)(x1-x2)*(x1-x2)+(double)(y1-y2)*(y1-y2));
//cout<<x1<<' '<<x2<<' '<<y1<<' '<<y2<<' '<<ret<<endl;
return ret;
} void tarjan(int u)
{
dfn[u]=low[u]=++cnt;
instack[u]=;
S.push(u);
for (int i=;i<E[u].size();i++)
{
int v=E[u][i];
if (!instack[v])
{
tarjan(v);
low[u]=min(low[u],low[v]); }
else if (instack[v]==) low[u]=min(low[u],dfn[v]);
} if (dfn[u]==low[u])
{
colcnt++;
int x;
do
{
x=S.top();
col[x]=colcnt;
instack[x]=;
S.pop();
}while (x!=u);
}
} void build(double r)
{
for (int i=;i<MAXN;i++) vector<int>().swap(E[i]);
for (int i=;i<=n-;i++)
for (int j=i+;j<=n;j++)
{
if (dist(x[i],y[i],x[j],y[j])<*r) addedge(i,j+n),addedge(j,i+n);
if (dist(x[i],y[i],x[j+n],y[j+n])<*r) addedge(i,j),addedge(j+n,i+n);
if (dist(x[i+n],y[i+n],x[j],y[j])<*r) addedge(i+n,j+n),addedge(j,i);
if (dist(x[i+n],y[i+n],x[j+n],y[j+n])<*r) addedge(i+n,j),addedge(j+n,i);
}
} void init()
{
for (int i=;i<=n;i++)
{
scanf("%d%d",&x[i],&y[i]);
scanf("%d%d",&x[i+n],&y[i+n]);
}
} void solve()
{
double lb=,ub=INF;
while (ub-lb>eps)
{
double mid=(lb+ub)/;
build(mid);
memset(instack,,sizeof(instack));
colcnt=cnt=;
for (int i=;i<=*n;i++) if (!instack[i]) tarjan(i);
int flag=;
for (int i=;i<=n;i++)
if (col[i]==col[i+n])
{
flag=;
break;
}
if (flag) lb=mid;
else ub=mid;
}
printf("%.2f\n",ub);
} int main()
{
while (scanf("%d",&n)!=EOF)
{
init();
solve();
}
return ;
}

[写随机数据上瘾了所以这次也附上]

 #include<bits/stdc++.h>

 int main()
{
freopen("test.out","w",stdout);
for (int i=;i<=;i++)
{
int n=rand()%+;
printf("%d\n",n);
for (int j=;j<=n;j++)
{
int x=rand()%-,y=rand()%-;
printf("%d %d ",x,y);
x=rand()%-,y=rand()%-;
printf("%d %d\n",x,y);
}
}
return ;
}

【2-SAT】HDU3622-Bomb Game的更多相关文章

  1. 【CodeForces 699B】One Bomb

    r[i],c[i]分别表示第i行有几个*,第i列有几个*. 枚举每个位置如果c[i]+r[j]-(本身是不是*)==总*数,则该位置即为答案. #include<cstdio> #incl ...

  2. 【数位dp】hdu3555 Bomb

    题意就是找0到n有多少个数中含有49.数据范围接近10^20 DP的状态是2维的dp[len][3]dp[len][0] 代表长度为len不含49的方案数dp[len][1] 代表长度为len不含49 ...

  3. 【HDU 3555】 Bomb

    [题目链接] 点击打开链接 [算法] 数位DP [代码] #include<bits/stdc++.h> using namespace std; #define MAXL 15 type ...

  4. 【WebApi系列】浅谈HTTP

    [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi如何传递参数 [04]详解WebApi测试和PostMan [05]浅谈WebApi Core ...

  5. 【WebApi系列】浅谈HTTP在WebApi开发中的运用

    WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...

  6. 【js实例】Array类型的9个数组方法,Date类型的41个日期方法,Function类型

    前文提要:[js实例]js中的5种基本数据类型和9种操作符 Array类型的9个数组方法 Array中有9个数组方法: 1.检测数组 2.转换方法 3.栈方法 4.队列方法 5.冲排序方法6.操作方法 ...

  7. Spring Cloud(三):服务提供与调用 Eureka【Finchley 版】

    Spring Cloud(三):服务提供与调用 Eureka[Finchley 版]  发表于 2018-04-15 |  更新于 2018-05-07 |  上一篇文章我们介绍了 Eureka 服务 ...

  8. 【插头DP】BZOJ1187- [HNOI2007]神奇游乐园

    [题目大意] 在n*m的网格中选一条回路,使权值和最大. [思路] 和之前裸的插头DP差不多,只不过现在回路不需要经过所有的格子.所以有以下几个注意点(具体看注释): (1)left和up插头相等的时 ...

  9. CSAPP:逆向工程【二进制炸弹】

    转载请注明出处:https://www.cnblogs.com/ustca/p/11694127.html 二进制炸弹任务描述 拓展:缓冲区溢出攻击 "二进制炸弹包含若干个阶段,每个阶段需要 ...

  10. zz【清华NLP】图神经网络GNN论文分门别类,16大应用200+篇论文最新推荐

    [清华NLP]图神经网络GNN论文分门别类,16大应用200+篇论文最新推荐 图神经网络研究成为当前深度学习领域的热点.最近,清华大学NLP课题组Jie Zhou, Ganqu Cui, Zhengy ...

随机推荐

  1. 使用Skyworking 作全链路api调用监控,Integration of Skyworking, auditing the whole chain circuit.

    Applicable scenario: Structure Map ~ Skywalking uses elasticsearch to store data, don't mistake elas ...

  2. jquery.cookie.js——jquery的cookie插件

    一.JS文件 /*! * jQuery Cookie Plugin v1.4.1 * https://github.com/carhartl/jquery-cookie * * Copyright 2 ...

  3. layui结合mybatis的pagehelper插件的分页通用的方法

    总体思路: 1.前台查询的时候将当前页和页大小传到后台 2.后台将当前页,页大小以及数据与数据总数返回前台,前台显示完表格完数据之后显示分页插件. 前台页面: 准备查询条件的表单,与数据表格,分页di ...

  4. ARP投毒攻击

    原理:通过分别伪装成客户机和服务器IP,将自己的MAC地址绑定在IP上,ARP错误的将IP解析为中间人MAC地址,从而来欺骗服务器网关和客户机,使信息必须通过客户机.

  5. imperva agent 的重新注册

    情况是这样 公司搭了一个环境有mysql的数据库并且安装了agent,imperva管理平台上也可以看到agent的注册信息,但是没想到的是有人把我的虚机给还原快照了,而且还没保存..... 这次写个 ...

  6. linux系统查找具体进程

    ps -ef | grep '查找内容' eg:ps -ef | grep '测试USB设备穿透'

  7. RSA加密登录

    1.首先下载前端JS加密框架:jsencrypt 2.后台添加解密帮助类:RSACrypto(参考文章最后) 3.在登录页面先引入jquery.min.js,在引入jsencrypt.min.js 4 ...

  8. /proc文件夹介绍

    Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过 ...

  9. mysql一个字符问题

    顺便记录一下在使用mysql过程中碰到的一些问题: 有时候使用脚本迁移数据时会碰到乱码的问题,即使将表字符集设置成utf8也无济于事,这个时候在执行sql之前加一句set names utf8即可.

  10. TCP可靠传输和拥塞控制

    1.TCP的可靠传输 tcp的可靠传输主要靠 来自接收方的确认报文 和 超时重传. 发出报文,计时器开始计时,在规定超时时间内未收到确认报文则重新发送. 注意:发送报文都留一个副本,如果收到确认报文就 ...