HDU3622 Bomb Game(二分+2-SAT)
题意
给n对炸弹可以放置的位置(每个位置为一个二维平面上的点),
每次放置炸弹是时只能选择这一对中的其中一个点,每个炸弹爆炸
的范围半径都一样,控制爆炸的半径使得所有的爆炸范围都不相
交(可以相切),求解这个最大半径.
题解
首先二分最大半径值,然后2-sat构图判断其可行性,
对于每 两队位置(u,uu)和(v,vv),如果u和v之间的距离小于2*id,
也就是说位置u和位置v处不能同时防止炸弹(两范围相交),
所以连边(u,vv) 和(v,uu),求解强连通分量判断可行性.
注意精度问题
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring> using namespace std;
#define debug(x) cout << "fuck bug " << x << "\n";
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
const int maxn = 4e4 + ;
const double eps = 0.00000001;
typedef long long ll; int n,m; struct edge
{
int to,nxt;
}e[maxn];//,eg[maxn]; int head[maxn],tot;//int head2[maxn],tot2; void add(int u ,int v){
e[++tot].to = v;
e[tot].nxt = head[u];
head[u] = tot;
// eg[++tot2].to = v;
// eg[tot2].nxt = head2[u];
// head2[u] = tot2;
} int dfn[maxn],low[maxn],num,inStack[maxn];
int stack[maxn],top,cnt,C[maxn];
void tarjan(int x) {
dfn[x] = low[x] = ++num;
stack[++top] = x; inStack[x] = true;
for (int i = head[x]; i; i = e[i].nxt) {
int y = e[i].to;
if (dfn[y] == ) {
tarjan(y);
low[x] = min(low[x], low[y]);
} else if (inStack[y]) {
low[x] = min(low[x], low[y]);
}
}
if (low[x] == dfn[x]) {
cnt++;
int z;
do {
z = stack[top--];
inStack[z] = false;
C[z] = cnt;
} while (z != x);
}
} struct Point
{
double x,y;
}P[maxn]; double dis(Point a,Point b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} void init(){
memset(head,,sizeof head);
memset(e,,sizeof e);
//memset(head2,0,sizeof head2);
memset(dfn,,sizeof dfn);
//memset(vis2,0,sizeof vis2);
//tot2 = tot = 0;
//cnt1 = cnt = 0;
tot = top = cnt = num = ;
memset(C,,sizeof C);
} int main(int argc, char const *argv[])
{
int n;
while(~scanf("%d",&n)){
for(int i = ;i < n + n;i += ){
scanf("%lf %lf %lf %lf",&P[i].x,&P[i].y,&P[i^].x,&P[i^].y);
}
double l = ,r = ;
double ans = -;
while(r - l > eps){
double mid = (l + r) / ;
init();
for(int i = ;i < n + n; i += ){
for(int j = i + ;j < n + n;j ++){
if(dis(P[i],P[j]) < * mid){
add(i,j^);
add(j,i^);
}
}
} for(int i = ;i < n + n;i += ){
for(int j = i + ;j < n + n;j ++){
if(dis(P[i],P[j]) < * mid){
add(i,j^);
add(j,i^);
}
}
} for(int i = ;i < n + n;i ++){
if(!dfn[i]) tarjan(i);
} bool flag = ;
for(int i = ;i < n + n;i += ){
if(C[i] == C[i + ]){
flag = ;
break;
}
} if(flag){
l = mid;
ans = mid;
}else{
r = mid;
}
}
printf("%.2lf\n",ans);
}
return ;
}
HDU3622 Bomb Game(二分+2-SAT)的更多相关文章
- hdu 3622 Bomb Game(二分+2-SAT)
Bomb Game Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 3622 Bomb Game(二分+2SAT)
题意:有一个游戏,有n个回合,每回合可以在指定的2个区域之一放炸弹,炸弹范围是一个圈,要求每回合的炸弹范围没有重合.得分是炸弹半径最小的值.求可以得到的最大分数. 思路:二分+2SAT. 二分炸弹范围 ...
- HDU-3622 Bomb Game 2sat
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3622 题意:一个平面上有很多的炸弹,每个炸弹的爆炸范围是一样的,求最大的爆炸范围使得炸弹之间不相互影响 ...
- HDU - 3622 Bomb Game(二分+2-SAT)
题目大意:玩一个放炸弹游戏,有N次放炸弹的机会,每次放炸弹时,你都有两个位置能够选择.问怎样放炸弹,能使爆炸的炸弹的半径的最小值最大(炸弹爆炸半径能够控制,可是爆炸形成的圈不能有重叠部分) 解题思路: ...
- 2 - sat 模板(自用)
2-sat一个变量两种状态符合条件的状态建边找强连通,两两成立1 - n 为第一状态(n + 1) - (n + n) 为第二状态 例题模板 链接一 POJ 3207 Ikki's Story IV ...
- 2-SAT 小结
PS:今天(2014.10.27)准备PPT,明天在组合数学课上与大家一起分享一下2-SAT.我以为是一件简单的事情.但是,当我看了自己这篇博客以后,发现居然还是不懂.很多资料不全,也没仔细讲.整理了 ...
- 2-sat+二分搜索hdu(3622)
hdu3622 Bomb Game Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu3622(二分+two-sat)
传送门:Bomb Game 题意:给n对炸弹可以放置的位置(每个位置为一个二维平面上的点),每次放置炸弹是时只能选择这一对中的其中一个点,每个炸弹爆炸的范围半径都一样,控制爆炸的半径使得所有的爆炸范围 ...
- HDU3622(二分+2-SAT)
Bomb Game Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- Vue之混入(mixin)与全局混入
Vue之混入(mixin)与全局混入 接下来通过一个简单的例子看看混入的基础用法: 首先新建一个mixin.js文件,添加以下代码. let mixin = { data() { return { m ...
- mysql:启动服务时遇到的问题
1.cmd命令: 在切换路径时,如果要切到另外一个磁盘,比如从C盘切到E盘,命令如下: cd /d 你要切换的路径 2.错误:“服务名无效” 问题原因:mysql服务没有安装.(参考:https:// ...
- zabbix自定义监控,自定义图表。
zabbix server:hostname=Zabbix server ip:192.168.100.7 zabbix agent: hostname=host3 ip:192.168.100.3 ...
- qt 之http学习
在Qt网络编程中,需要用到协议,即HTTP.它是超文本传输协议,它是一种文件传输协议. 新建工程名为“http”,然后选中QtNetwork模块,最后Base class选择QWidget.注意:如果 ...
- python之scrapy的debug、shell、settings、pipelines
1.debug了解 2.scrapy shell了解 Scrapy shell是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath表达式 使用方法: scrap ...
- Ubuntu端口常用命令
# 查看哪些进程打开了指定端口port(对于守护进程必须以root用户执行才能查看到) lsof -i:port # 查看哪些进程打开了指定端口port,最后一列是进程ID(此方法对于守护进程作用不大 ...
- SSH客户端神器之 MobaXterm
SSH客户端神器之 MobaXterm 由于需要连接远程 Linux 服务器,早期使用过 Putty,SecureCRT,后面主要使用 Xshell. 自从接触了 MobaXterm之后,个人感觉比 ...
- 归纳整理Python中的控制流语句的知识点
归纳整理Python中的控制流语句的知识点 Python 解释器在其最简单的级别,以类似的方式操作,即从程序的顶端开始,然后一行一行地顺序执行程序语句.例如,清单 1 展示了几个简单的语句.当把它们键 ...
- CWinThread类,使用后要不要使用CloseHandle释放内核
在VC++中用AfxBeginThread()开启线程的时候,返回的是CWinThead类的指针.但是使用后是否应该用CloseHandle释放内核资源呢? 在<Windows核心编程>中 ...
- Python3 Selenium自动化web测试 ==> 第二节 页面元素的定位方法 -- iframe专题 <下>
学习目的: 掌握iframe矿建的定位,因为前端的iframe框架页面元素信息,大多时候都会带有动态ID,无法重复定位. 场景: 1. iframe切换 查看iframe 切换iframe 多个ifr ...