【题目大意】

给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. 推箱子 BFS

    [编程题] 推箱子 大家一定玩过“推箱子”这个经典的游戏.具体规则就是在一个N*M的地图上,有1个玩家.1个箱子.1个目的地以及若干障碍,其余是空地.玩家可以往上下左右4个方向移动,但是不能移动出地图 ...

  2. POJ 3233 Matrix Power Series (矩阵快速幂)

    题目链接 Description Given a n × n matrix A and a positive integer k, find the sum S = A + A^2 + A^3 + - ...

  3. 爬虫--Scrapy框架的基本使用

    流程框架 安装Scrapy: (1)在pycharm里直接就可以进行安装Scrapy      (2)若在conda里安装scrapy,需要进入cmd里输入指令conda install scrapy ...

  4. vue登录/查看/结束端口号

    下班时间到啦! --下班都是他们的,而我,还是什么都没有. vue登录(未登录情况下不允许进入) 在路由里加上登录的权限 meta: { requireAuth: true, title: 'Logi ...

  5. CAD启动提示"是否关闭命令行"不管点击什么,都会闪退的解决办法

    AutoCAD splash screen starts up and then closes   AutoCAD splash screen starts up and then closes (S ...

  6. phpmywind调用方法大全

    头部文件调用 <?php require_once('header.php'); ?> 底部文件调用 <?php require_once('footer.php'); ?> ...

  7. go时间和日期

    1. time包 2. time.Time类型,用来表示时间 3. 获取当前时间, now := time.Now() 4. time.Now().Day(),time.Now().Minute(), ...

  8. javascript反混淆之packed混淆(一)

    javascript反混淆之packed混淆(一) 什么是JavaScript反混淆,在理解这个概念前我们先来看下什么是代码混淆,代码混淆,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理 ...

  9. 144.Binary Tree Preorder Traversal---二叉树先序、中序非递归遍历

    题目链接 题目大意:返回二叉树的先序遍历list.中序见94,后序见145. 法一:普通递归遍历,只是这里多了一个list数组,所以分成了两个函数.代码如下(耗时1ms): public List&l ...

  10. 苹果容器超出内容overflow滑动卡顿问题

    -webkit-overflow-scrolling:touch; 就这么一段代码,加载需要滚动的容器css样式中.因为苹果的硬件加速产生的后果....