`
king_tt
  • 浏览: 2290960 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

HDU 3622 Bomb Game(2-SAT + 二分)

 
阅读更多

【题目链接】

http://acm.hdu.edu.cn/showproblem.php?pid=3622


【题目大意】

要在坐标轴上放N次,每次可以选择两个位置中的一个位置放置,每个都可以控制它的爆炸范围(以放置位置为圆心的半径为r的圆圈),问半径最大可以多少,使得任意两个的爆炸范围都不重合。


【思路】

类似与poj 2296, 但是判断重合的方法容易多了,果断1Y

注意精度问题。


【代码】

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#define SQ(x) ((x)*(x))
using namespace std;

const int MAXN = 110;
const int VN   = MAXN*2;
const int EN   = VN*VN*2;
const int INF  = 0x3f3f3f3f;
const double eps = 1e-9;
int n;
vector<int>g[VN];

struct Node{
    int x, y;
    void input(){scanf("%d%d",&x,&y);}
}arr[MAXN][2];

void init(){
    for(int i=0; i<2*n; ++i)
        g[i].clear();
}
void addEdge(int u, int v){
    g[u].push_back(v);
}

class Two_Sat{
public:
    bool check(){
        scc(); 
        for(int i=0; i<n; ++i)
            if(belong[i] == belong[i+n])
                return false;
        return true;
    }
private:
    void tarjan(const int u){
        int v;
        low[u] = dfn[u] = ++idx;
        sta[top++] = u;
        instack[u] = true;
        for(int i=0; i<g[u].size(); ++i){
            v = g[u][i];
            if(dfn[v] == -1){
                tarjan(v);
                low[u] = min(low[u], low[v]);
            }else if(instack[v]){
                low[u] = min(low[u], dfn[v]);
            }
        }
        if(low[u] == dfn[u]){
            ++bcnt;
            do{
                v = sta[--top];
                instack[v] = false;
                belong[v] = bcnt;
            }while(u != v);
        }
    }
    void scc(){
        idx=top=bcnt=0;
        memset(instack, 0, sizeof(instack));
        memset(dfn, -1, sizeof(dfn));
        for(int i=0; i<2*n; ++i)
            if(dfn[i] == -1)
                tarjan(i);
    }
private:
    int idx, top, bcnt;
    int low[VN], dfn[VN], belong[VN], sta[VN];
    bool instack[VN];
}sat;


double getDist(Node& a, Node& b){
    return  sqrt(SQ(a.x*1.0-b.x)+SQ(a.y*1.0-b.y));
}

void buildGraph(double r){
    init();
    for(int i=0; i<n; ++i){
        for(int j=i+1; j<n; ++j){
            if(2*r - getDist(arr[i][0], arr[j][0]) > eps) { //上, 上
                addEdge(i, j+n);
                addEdge(j, i+n);
            }
            if(2*r - getDist(arr[i][0], arr[j][1]) > eps) { //上, 下
                addEdge(i, j);
                addEdge(j+n, i+n);
            }
            if(2*r - getDist(arr[i][1], arr[j][0]) > eps){ // 下,上
                addEdge(i+n, j+n);
                addEdge(j, i);
            }
            if(2*r - getDist(arr[i][1], arr[j][1]) > eps){ // 下,下
                addEdge(i+n, j);
                addEdge(j+n, i);
            }
        }
    }
}

int main(){

    while(~scanf("%d", &n)){
    
        for(int i=0; i<n; ++i){
            arr[i][0].input();
            arr[i][1].input();
        }

        double l=0, r=20000, m, ans;

        while(r - l > eps){
            m = (r+l)/2.0;
            // 建图
            buildGraph(m);
            if(sat.check()){
                l = m+eps;
                ans = m;
            }
            else r=m;
        }
    
        printf("%.2f\n", ans);
    }


    return 0;
}


分享到:
评论

相关推荐

    2-SAT学习资料

    "【2-sat】专题~ - Amb@HDU - 博客园_files"和"2-SAT总结 - kuangbin - 博客园_files"这两个文件夹可能包含了与博客文章相关的图片、代码示例或其他辅助材料,有助于读者更好地理解2-SAT的实现和应用。 总的来说,...

    HDU+2000-2099+解题报告

    1. **基础算法**:如排序(快速排序、归并排序、冒泡排序等)、搜索(二分查找、深度优先搜索、广度优先搜索等)。 2. **动态规划**:这类问题通常需要找到一种状态转移方程,通过递推或自底向上的方法求解。例如...

    2-sat---hdu3062

    2-sat---hdu3062,代码详尽,清晰,格式规范,亲测无误。

    HDU+2000-2099+解题报告.zip

    4. **排序与搜索**:快速排序、归并排序、二分查找等经典算法在HDU题目中经常出现。解题报告会深入讲解这些算法的原理和应用场景,并给出高效的实现代码。 5. **字符串处理**:包括KMP算法、Manacher's Algorithm等...

    HDU-EID-V2-核心板1

    I2C(Inter-Integrated Circuit)接口,如PB6/I2C_SCL(时钟)和PB7/I2C_SDA(数据),用于连接各种外围设备,如传感器和驱动器。 此外,STM32还支持USB(Universal Serial Bus)接口,如PA8/USB_EN(使能)和PA10/...

    HDU-EID-V2-扩展板1

    HDU-EID-V2-扩展板1是一款专为STM32微控制器设计的硬件扩展板,主要用于增强核心板的功能。该扩展板具有多种接口和功能,包括ADC(模数转换器)、电位器、DAC(数模转换器)输出以及TEST_V跳线,能够满足用户在模拟...

    hi3861-hdu-iot-application-master.zip

    hi3861_hdu_iot_application-master.zip Hi3861V100开发OpenHarmony嵌入式应用. 2025年2月13日

    hdu-OS-simple-shell,Linux_的_Shell_命令窗口_demo_版实现_shell-demo.zip

    hdu-OS-simple-shell,Linux_的_Shell_命令窗口_demo_版实现_shell-demo

    hdu 入门代码(2000-2099)

    这些题目涵盖了诸如数学、图论、动态规划、贪心算法、二分查找、回溯法、数据结构等多个领域。 在这个压缩包中,"HDU 2000-2099 解题报告.CHM"是一个CHM(Compiled Help Manual)格式的文件,它是一种常见的帮助...

    hdu1250高精度加法

    具体地,题目涉及到了斐波那契数列的一个变种:F(1)=1, F(2)=1, F(3)=1, F(4)=1, F(n&gt;4)=F(n-1)+F(n-2)+F(n-3)+F(n-4),其中n &gt; 4。这里的关键是要能够计算出F(n)的值,而由于这个序列的增长速度非常快,传统的整数...

    二分匹配题集

    ### 二分匹配题集概览 #### 一、基础知识 **匹配**:在一个二分图\( G \)中,存在一个子图\( G' \),若\( G' \)的边集中任意两条边不共用同一个顶点,则称\( G' \)的边集为\( G \)的一个匹配。 **最大匹配**:在...

    hdu-page-11-answer.rar_hdu_hdu oj第十一页_page_搜题_杭电oj

    对于初学者来说,首先要了解基础数据结构,如数组、链表、栈、队列、树、图等,以及基本的搜索和排序算法,如二分查找、冒泡排序、快速排序等。这些知识是解决ACM问题的基础。 二、杭电OJ系统介绍 杭电OJ是在线进行...

    HDU实验板硬件手册-STM32F1031

    HDU-EID-V2开发板是一款基于STM32F103VCT6微控制器的实验平台,专门设计用于教学和电子爱好者进行嵌入式系统的学习与开发。STM32F103VCT6处理器内核是基于ARM Cortex-M3架构的,具有120MHz的工作频率,内置256KB的...

    HDU实验板操作手册-STM32F1031

    HDU实验板操作手册-STM32F1031主要涵盖了四个关键部分,旨在帮助用户熟悉并有效地使用基于STM32F1031的开发板进行嵌入式系统开发。以下是各部分的详细说明: 1. **开发板外观说明** 开发板设计紧凑,左侧和上侧...

    leetcode中国-ACM_Training::balloon:不是为了比赛,而是为了训练和兴趣

    2. BNU 1440 --- basic dfs 3. POJ 1190 --- dfs + pruning(Strong) 4. UVALive 2243 --- dfs 5. FZU 2196 --- double bfs 6. PKU 1426 --- bfs + pruning 7. BNU 1038 --- dfs transform 8. PKU 1562 --- dfs ...

    hdu acm教案5-7

    1. **ACM基础算法**:可能包括排序、搜索、图论等基础算法,这是ACM竞赛中的常考内容,例如快速排序、二分查找、Dijkstra算法、Floyd算法等。 2. **数据结构**:如链表、树、堆、栈、队列、图等,以及它们在解决...

    hdu 2000 -2099 题集

    这些题目来自于杭州电子科技大学的在线评测系统HDU的题集,涵盖了从2000到2009的编号。这些题目旨在测试编程者的基本算法理解、数学计算能力以及问题解决技巧。以下是对这些题目中涉及知识点的详细解释: 1. **2000...

    hdu acm教案2

    - **Fibonacci数列**:递推公式为F(n) = F(n-1) + F(n-2),其中F(1) = 1,F(2) = 1。递推求解Fibonacci数列展示了递推在解决数列问题中的应用。 2. **递推公式的伟大意义**:递推公式能帮助我们理解问题的结构,...

    hdu 1695 GCD(欧拉函数+容斥原理).docx

    "hdu 1695 GCD(欧拉函数+容斥原理)" 题目大意是:给定 a, b, c, d, k,找到一队 x, y,满足 g(x, y) = k,且 x ∈ [1, b], y ∈ [1, d],问有多少对符合要求的 (x, y)。 思路是:gcd(x, y) == k 解释 x, y 都能...

Global site tag (gtag.js) - Google Analytics