UVALive 4035 - Undetectable Tour(并查集)

题意:给定一个 N * N(3 <= N <= 10000)的矩形区域,左下角为(0,0),右上角为(N,N),现在要从左下角走到右上角,但是有 k(k <= 100)个监视器,每个监视器的监视范围都是统一的,现给定监视范围可能出现的种类与概率,求能够逃出去的概率。(计算距离时均用曼哈顿距离)

1、若两个监视器的距离 <= 两个监视器的监视范围之和,则这两个监视器间的路就不可走;

2、若监视器距离墙的距离 <= 监视器的监视范围,则监视器与墙之间就不可走;

综上,对于每一个监视范围,可以借助并查集判断是否 "左边界和上边界" 与 "右边界和下边界" 之间不可走,若可走则证明在此监视范围下可以逃出去。

若将监视范围排序,并二分找临界答案,时间将更短。

代码如下:

 

  1 #pragma comment(linker, "/STACK:102400000, 102400000")
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cctype>
  5 #include<cstdlib>
  6 #include<cmath>
  7 #include<iostream>
  8 #include<sstream>
  9 #include<iterator>
 10 #include<algorithm>
 11 #include<string>
 12 #include<vector>
 13 #include<set>
 14 #include<map>
 15 #include<deque>
 16 #include<queue>
 17 #include<stack>
 18 #include<list>
 19 #define fin freopen("in.txt", "r", stdin)
 20 #define fout freopen("out.txt", "w", stdout)
 21 #define pr(x) cout << #x << " : " << x << "   "
 22 #define prln(x) cout << #x << " : " << x << endl
 23 #define Min(a, b) ((a < b) ? a : b)
 24 #define Max(a, b) ((a < b) ? b : a)
 25 typedef long long ll;
 26 typedef unsigned long long llu;
 27 const int INT_INF = 0x3f3f3f3f;
 28 const int INT_M_INF = 0x7f7f7f7f;
 29 const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
 30 const ll LL_M_INF = 0x7f7f7f7f7f7f7f7f;
 31 const double pi = acos(-1.0);
 32 const double EPS = 1e-8;
 33 const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
 34 const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
 35 const ll MOD = 1e9 + 7;
 36 using namespace std;
 37 
 38 #define NDEBUG
 39 #include<cassert>
 40 const int MAXN = 100 + 10;
 41 const int MAXT = 10000 + 10;
 42 
 43 struct Detector{
 44     int x, y;
 45     Detector(int xx = 0.0, int yy = 0.0) : x(xx), y(yy) {}
 46 };
 47 
 48 struct Query{
 49     int radius;
 50     double pro;
 51     bool operator < (const Query &rhs) const{
 52         return radius < rhs.radius;
 53     }
 54 }q[MAXN];
 55 
 56 int T, m, fa[MAXN * 3], n;
 57 vector<Detector> vec;
 58 
 59 int Find(int x) {
 60     return fa[x] = (fa[x] == x) ? x : Find(fa[x]);
 61 }
 62 
 63 inline int get_dist(int x1, int y1, int x2, int y2) {
 64     return abs(x1 - x2) + abs(y1 - y2);
 65 }
 66 
 67 inline void merge_(int x, int y) {
 68     int one = Find(x), two = Find(y);
 69     if(one == two)  return;
 70     if(one < two)  fa[two] = one;
 71     else  fa[one] = two;
 72 }
 73 
 74 bool judge(int dist) {
 75     for(int i = 0; i < MAXN * 3; ++i)  fa[i] = i;
 76     int len = (int)vec.size() - 1;
 77     for(int i = 1; i <= len; ++i)
 78         for(int j = i + 1; j <= len; ++j) {
 79             int tmp = get_dist(vec[i].x, vec[i].y, vec[j].x, vec[j].y);
 80             if(tmp <= dist * 2)  merge_(i, j);
 81         }
 82     for(int i = 1; i <= len; ++i) {
 83         if(vec[i].x <= dist || n - vec[i].y <= dist)  merge_(0, i);
 84         if(vec[i].y <= dist || n - vec[i].x <= dist)  merge_(i, len + 1);
 85     }
 86     return Find(0) != Find(len + 1);
 87 }
 88 
 89 int solve() {
 90     int l = 0, r = m - 1;
 91     while(l < r) {
 92         int mid = l + (r - l + 1) / 2;
 93         if(judge(q[mid].radius))  l = mid;
 94         else  r = mid - 1;
 95     }
 96     return judge(q[l].radius) ? l : -1;
 97 }
 98 
 99 int main(){
100 //    fin;
101     scanf("%d", &T);
102     while(T--) {
103         vec.clear();
104         vec.push_back(Detector());
105         scanf("%d%d", &n, &m);
106         for(int i = 0; i < m; ++i)  scanf("%d%lf", &q[i].radius, &q[i].pro);
107         sort(q, q + m);
108         int u, v;
109         while(scanf("%d", &u) == 1 && u != -1) {
110             scanf("%d", &v);
111             vec.push_back(Detector(u, v));
112         }
113         int len = solve();
114         double ans = 0.0;
115         for(int i = 0; i <= len; ++i)  ans += q[i].pro;
116         printf("%g\n", ans);
117     }
118     return 0;
119 }

 

转载于:https://www.cnblogs.com/tyty-TianTengtt/p/6092196.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值