P2498 [SDOI2012]拯救小云公主

\(\color{#0066ff}{ 题目描述 }\)

英雄又即将踏上拯救公主的道路……

这次的拯救目标是——爱和正义的小云公主。

英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss。当英雄意识到自己还是等级1的时候,他明白这就是一个不可能完成的任务。

但他不死心,他在想,能不能避开boss去拯救公主呢,嘻嘻。

Boss的洞穴可以看成一个矩形,英雄在左下角(1,1),公主在右上角(row,line)。英雄为了避开boss,当然是离boss距离越远越好了,所以英雄决定找一条路径使到距离boss的最短距离最远。

Ps:英雄走的方向是任意的。

你可以帮帮他吗?

当英雄找到了美丽漂亮的小云公主,立刻就被boss包围了!!!英雄缓闭双眼,举手轻挥,白光一闪后使用了回城卷轴,回到了城堡,但只有小云公主回去了……因为英雄忘了进入回城的法阵了。

\(\color{#0066ff}{输入格式}\)

第一行,输入三个整数,n表示boss的数目,row,line表示矩形的大小;

接下来n行,每行分别两个整数表示boss的位置坐标。

\(\color{#0066ff}{输出格式}\)

输出一个小数,表示英雄的路径离boss的最远距离,精确到小数点后两位。

\(\color{#0066ff}{输入样例}\)

1 3 3
2 2

1 3 3
3 1

\(\color{#0066ff}{输出样例}\)

1.00

2.00

\(\color{#0066ff}{数据范围与提示}\)

20%数据,boss坐标范围小于等于50;

60%数据,n<=1500;

100%数据,n<=3000;

\(\color{#0066ff}{ 题解 }\)

显然要二分答案

于是,问题就变成了二维奶酪(见NOIP2017 奶酪

\(O(n^2logn)\),卡卡二分就过了

#include<bits/stdc++.h>
#define LL long long
LL in() {
    char ch; LL x = 0, f = 1;
    while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
    for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
    return x * f;
}
const int maxn = 3505;
int n;
bool flag;
double X, Y;
struct node {
    double x, y;
    node(double x = 0, double y = 0): x(x), y(y) {}
}e[maxn];
std::vector<int> v[maxn];
bool vis[maxn];
double D[maxn][maxn];
std::queue<int> q;
bool ok(double mid) {
    while(!q.empty()) q.pop();
    for(int i = 1; i <= n; i++) {
        if(e[i].x < mid || Y - e[i].y < mid) q.push(i), vis[i] = true;
        else vis[i] = false;
    }
    while(!q.empty()) {
        int tp = q.front(); q.pop();
        if(X - e[tp].x < mid || e[tp].y < mid) return false;
        for(int i = 1; i <= n; i++) if(!vis[i] && D[tp][i] < mid * mid * 4.0) vis[i] = true, q.push(i);
    }
    return true;
}
int main() {
    n = in(), X = in() - 1, Y = in() - 1;
    for(int i = 1; i <= n; i++) e[i].x = in() - 1, e[i].y = in() - 1;
    for(int i = 1; i <= n; i++)
        for(int j = i + 1; j <= n; j++) {
            node a = e[i], b = e[j];
            D[i][j] = D[j][i] = (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
        }
    double l = 0, r = std::min(X, Y), ans = r;
    int t = 200;
    while(t--) {
        double mid = (l + r) / 2.0;
        if(ok(mid)) ans = mid, l = mid;
        else r = mid;
    }
    printf("%.2f", ans);
    return 0;
}

原文地址:https://www.cnblogs.com/olinr/p/10357203.html

时间: 2024-10-13 11:47:13

P2498 [SDOI2012]拯救小云公主的相关文章

二分+并查集【bzoj3007】[SDOI2012]拯救小云公主

Description 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意识到自己还是等级1的时候,他明白这就是一个不可能完成的任务. 但他不死心,他在想,能不能避开boss去拯救公主呢,嘻嘻. Boss的洞穴可以看成一个矩形,英雄在左下角(1,1),公主在右上角(row,line).英雄为了避开boss,当然是离boss距离越远越好了,所以英雄决定找一条路径使到距离bo

[SDOI2012]拯救小云公主

题目链接: 题目 分析 最大的最小最小的最大 一看就非常的二分 考虑二分之后转化成判定联通问题 于是可以考虑奶酪 直接维护联通好像很\(GG\),正难则反考虑维护不连通 什么时候不连通,发现当左上角和右下角分在两个块里面就凉了 当上和右边或上和下边联通的时候左上角和右下角被分割在两块 另外两种情况同理 于是并查集仿照奶酪维护一下,如果四种都没联通说明可以走到 外面再套个二分 复杂度\(O(n ^ 2 * log(n))\) 此代码吸氧可过 #include<bits/stdc++.h> #de

【BZOJ】【3007】拯救小云公主

思路题 我的naive的做法是二分答案+判定是否有路径可走……但是没有正确理解[走的方向任意]这句话…… 其实就是说想咋走咋走= =360°无死角乱走…… 所以其实是个平面上的问题…… 我们可以换个方向来考虑……二分一个答案,判断英雄走到/走不到公主那里,是不是就等价于,boss控制的区域连起来了使得英雄走不到公主那里了?(狼抓兔子的即视感) 所以我们可以转化成从上边&左边,在boss之间走,使得走到下边&右边 路径上最大的一条边(边权代表着如果英雄从这两个boss之间经过,离两个boss

BZOJ:4219: 跑得比谁都快 3007: 拯救小云公主

4219: 跑得比谁都快 3007: 拯救小云公主 后一道是前一道的弱化版. 如果考虑一下二分答案再判定,判定的过程无非就是把每个点变成一个以答案为半价的圆,然后如果左上和右下被切开了肯定就不合法,那就变成1001里面那种对偶图,跑一下spfa就好. 再看其实就不需要二分答案了,把各个boss连接起来,二分的答案达到边权一半时这两个圆就相交.整条路径会在达到最大边权的时候完全连通,那么最大边权最小的路径就是答案. 所以就三角剖分+最小生成树,至于三角剖分我选择拉模版. 貌似得用long doub

bzoj3007: 拯救小云公主

Description 英雄又即将踏上拯救公主的道路…… 这次的拯救目标是——爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意识到自己还是等级1的时候,他明白这就是一个不可能完成的任务. 但他不死心,他在想,能不能避开boss去拯救公主呢,嘻嘻. Boss的洞穴可以看成一个矩形,英雄在左下角(1,1),公主在右上角(row,line).英雄为了避开boss,当然是离boss距离越远越好了,所以英雄决定找一条路径使到距离bo

【bzoj3007】拯救小云公主 二分+对偶图+并查集

题目描述 英雄又即将踏上拯救公主的道路…… 这次的拯救目标是——爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意识到自己还是等级1的时候,他明白这就是一个不可能完成的任务. 但他不死心,他在想,能不能避开boss去拯救公主呢,嘻嘻. Boss的洞穴可以看成一个矩形,英雄在左下角(1,1),公主在右上角(row,line).英雄为了避开boss,当然是离boss距离越远越好了,所以英雄决定找一条路径使到距离boss的最短距离

[BZOJ 3007] 拯救小云公主 对偶图

题意 给定 $r, c$ , 以及矩形 $(1, 1), (r, c)$ 内的 $n$ 个点组成的点集 $S$ . 求一条从 $(1, 1)$ 到 $(r, c)$ 的矩形内的路径, 最大化路径到 $S$ 中的点的最小距离. $n \le 3000$ . 分析 考虑二分答案 $x$ , 判定: 当前有 $n$ 个半径为 $x$ 的圆, 是否能从 $(1, 1)$ 走到 $(r, c)$ . 原图存在路径, 当且仅当对偶图不存在将 $(1, 1)$ 与 $(r, c)$ 割开的边集, 即不存在从左

BZOJ 3007 解救小云公主 二分答案+对偶图

题目大意:给定一个矩形和矩形内的一些点.求一条左下角到右上角的路径.使全部点到这条路径的最小距离最大 最小距离最大.果断二分答案 如今问题转化成了给定矩形中的一些圆形障碍物求左下角和右上角是否连通 然后就是对偶图的问题了 左下角和右上角连通等价于对偶图中左上两条边和右下两条边不连通 因此将全部相交的圆之间连边,从左上两条边广搜就可以 时间复杂度O(n^2log(min(r,l)/EPS)) #include <cmath> #include <cstdio> #include &l

小云APP移动建站初体验

这段时间一直在研究想给自己的站做一个真正意义上的移动站,APP也好.自适应也罢,也是伤透了脑筋. 为何要做移动站? 说简单一点,就是身边的朋友已证实,移动端的流量太大了,真是非常大.随便做一个H5页面带来的流量都要比PC上的高,这块就不做深入讨论.所以作为互联网创业者,进入移动端是早晚的事. 建站过程 去猪八戒.淘宝联系了几家,还联系了一些朋友公司,报价都是万元起步.也发了一些帖子咨询过,不过从回帖来看基本都是打广告的居多. 没办法,自己的事情很少有人为你考虑,而更多是在推销自己的产品. 最重要