最近几天散搞哭了,都怪以前看到没好好学。。。

就拿一道题来说事PKU:1151,以前Matrix67写过这道题的BLOG,引用一下:

VOJ1056(http://www.vijos.cn/Problem_Show.asp?id=1056) 永远是离散化的经典问题。大意是给定平面上的n个矩形(坐标为整数,矩形与矩形之间可能有重叠的部分),求其覆盖的总面积。平常的想法就是开一个与二维坐标规模相当的二维Boolean数组模拟矩形的“覆盖”(把矩形所在的位置填上True)。可惜这个想法在这里有些问题,因为这个题目中坐标范围相当大(坐标范围为-10^8到10^8之间的整数)。但我们发现,矩形的数量n<=100远远小于坐标范围。每个矩形会在横纵坐标上各“使用”两个值, 100个矩形的坐标也不过用了-10^8到10^8之间的200个值。也就是说,实际有用的值其实只有这么几个。这些值将作为新的坐标值重新划分整个平面,省去中间的若干坐标值没有影响。我们可以将坐标范围“离散化”到1到200之间的数,于是一个200*200的二维数组就足够了。实现方法正如本文开头所说的“排序后处理”。对横坐标(或纵坐标)进行一次排序并映射为1到2n的整数,同时记录新坐标的每两个相邻坐标之间在离散化前实际的距离是多少。这道题同样有优化的余地。

我具体讲讲怎么优化:

当我们定义一个Boolean类型去解小范围的这道题是,假如是这样的图形:

哎呀,好挫的一张图。。(该学学绘图软件了)

坐标分别对应是:(0,0)-(2,2),(2,2)-(4,4);

当我们用Boolean枚举是,每次枚举一个小格子的左上角的状态代替这个单位面积;比如:

可以化成这样的左边矩阵:11000

11110

01110

01110

具体每个格子代表为1;但是程序怎么写,可以把每个格子的一个角的状态表示这个格子的状态,这样就OK了,我开始在这里纠结了老半天

但是这道题、N和M如此大,普通的标记肯定没戏,

SO ,离散:

神马是离散,就是把点的位子分别映射对应,

这里是:我们排序好,然后把这些点的位置分别映射其排序好的序号。(好像很绕口的样子) 23333;

等下在结合代码看看,

然后我们发现对应好一个新的图形出现了,

然后再用前面的方法去枚举标状态;

最后统计;

#include<iostream>
#include <algorithm>
#include<string.h>
#include<cstdio>
#include<math.h>
using namespace std;
double x[],y[],s[][];
int xy[][];
int n,cas=;
double sum;
int main()
{
int i,j,k;
while(cin>>n)
{
if(n==) break;
cas++;
k=;
sum=0.0;
memset(xy,,sizeof(xy)); for(i=;i<=n;i++)
{
cin>>s[i][]>>s[i][]>>s[i][]>>s[i][];
x[k]=s[i][];
y[k]=s[i][];
k++;
x[k]=s[i][];
y[k]=s[i][];
k++;
}
sort(x,x+*n);
sort(y,y+*n); for (int i=;i<=n;i++)
{
int i1=lower_bound(x,x+*n,s[i][])-x;//二分查找,跟普通的FOR语句一样
int j1=lower_bound(y,y+*n,s[i][])-y;
int i2=lower_bound(x,x+*n,s[i][])-x;
int j2=lower_bound(y,y+*n,s[i][])-y;
for (int p1=i1;p1<i2;p1++)//标记状态,记住我们是以一个方块的角标记状态所以p1<i2,不是<=
for (int p=j1;p<j2;p++)
xy[p1][p]=;
}
for (int i=;i<*n;i++)//统计
for (int j=;j<*n;j++)
if (xy[i][j]) {
sum+=(x[i+]-x[i])*(y[j+]-y[j]);
}
printf("Test case #%d\n",cas);
printf("Total explored area: %.2f\n",sum);
printf("\n");
}
return ;
}

最后还得贴代码,尼玛,我自己的看不懂怎么描述的?

还有跟我一样陷入离散杯具的孩子,欢迎留言,一起解决,^&&^^

其实我是被昨天不现在说是前天的一道离散搞死了。

好吧!THANKS @SKY J的题解让我抄的体无完肤。哈哈。

何为离散:

我的总结是将我们不能直接处理的点的关系对应于其他关系,也就是说离散后的点之间的关系并没有改变。

这是必须的条件。

先来题目:

XiaoMing recently plays the World of Warcraft game, you know, World of the Warcraft map is very big and now XiaoMing falls into a large forest, assuming that the forest is a rectangle with N by M. there are only some trees in the forest that he cannot go through and he can't be out of the boundary of the forest. He would like to know that could he find the exit of the forest.

Input

The first line of input is T,( 1 <= T <= 50) the number of test cases. Each test case starts with three integers N,M,K(1<=N,M<=1000000,0<=K<=200) ,which means that the sizes of the maze and the number of trees. Then follow K lines, each line contains two integers Xi, Yi(0<=Xi< N,0<=Yi<M) denoting the position of each tree. The Last line consists of four integers Sx, Sy, Ex, Ey (0<=Sx, Ex<N, 0<=Sy, Ey<M) denoting the position of XiaoMing's starting place and the position of the exit.
Note: The starting place and the exit will not have trees there.

Output

For every test case, you should output "Case k: " first in a single line, where k indicates the case number and starts at 1. Then print "YES" if XiaoMing can reach the exit, or print "NO" if he cannot.

Sample Input

2
6 6 5
0 0
0 1
1 1
2 0
2 1
1 0 5 5
6 6 4
0 0
0 1
2 0
2 1
1 0 5 5

Sample Output

Case 1: NO
Case 2: YES 这题是BFS但是坐标区域太大,然后障碍的数目很少,参考SKY J学长的题解:http://blog.csdn.net/sky_j123/article/details/36434417
我们发现只有相邻的两个点是不能到达的,其他如果相差很大的格子的话,空出来的格子基本没有。
所以我们只需要“压缩”他们就可以。
当不相邻的时候我们就可以让他们的距离相差一点点就ok了;具体看上面URL的代码吧;
虽然有198行但是99行是那个啥^^

离散-ACM一道强有力的工具的更多相关文章

  1. ACM一道关于素数查找的题

    在ACM做这么一道题: 我用了最简单的查找素数的方法: bool isPrime(int n) { int t=n-1; while(t>2) { if(n%t==0) { return fal ...

  2. [原创]使用命令行工具提升cocos2d-x开发效率(二)之CocosBuilder篇

    如果你正在使用CocosBuilder或者是其他基于CocosBuilder源码改装而成的工具为你的游戏搭建场景或者UI,那你一定要看看这篇文章:)   你是否已经厌倦了无聊的手工publish操作? ...

  3. 使用命令行工具提升cocos2d-x开发效率 之CocosBuilder篇

    http://www.cnblogs.com/flyFreeZn/p/3617983.html 假设你正在使用CocosBuilder或者是其它基于CocosBuilder源代码改装而成的工具为你的游 ...

  4. ETL工具-informatica产品部分功能、接口采购梳理

    在项目中,经常遇到要进行产品采购,虽然一直在使用informatica工具做数据的抽取.清晰转换.加载,但是使用的功能也比较初级.在遇到采购时大致的进行了梳理. 序号 名称 产品功能说明 产品选配说明 ...

  5. spark机器学习从0到1基本的统计工具之(三)

      给定一个数据集,数据分析师一般会先观察一下数据集的基本情况,称之为汇总统计或者概要性统计.一般的概要性统计用于概括一系列观测值,包括位置或集中趋势(比如算术平均值.中位数.众数和四分位均值),展型 ...

  6. 现代工程仿真CAE技术介绍

    随着现代科学技术的发展,人们正在不断建造更为快速的交通工具.更大规模的建筑物.更大跨度的桥梁.更大功率的发电机组和更为精密的机械设备.这一切都要求工程师在设计阶段就能精确地预测出产品和工程的技术性能, ...

  7. Neural ODE相关论文摘要翻译

    *****仅供个人学习记录***** Neural Ordinary Differential Equations[2019] 论文地址:[1806.07366] Neural Ordinary Di ...

  8. 前端学HTTP之URL

    × 目录 [1]URI [2]URL语法 [3]字符[4]编码方法 前面的话 一般地,URL和URI比较难以区分.接下来,本文以区分URL和URI为引子,详细介绍URL的用法 URI与URL的区别 U ...

  9. javascript正则表达式(RegExp)简述

    首先我们来思考以下两个个场景 我们使用window操作系统,有时候需要找一个文件,刚刚好这个文件我不知道放哪里去了,这个时候我们该怎么办呢? 我们使用word写论文的时候,不小心将"订价&q ...

随机推荐

  1. 为你的Windows7设置动态壁纸

    From:http://www.cnblogs.com/killerlegend/p/3644014.html By KillerLegend DreamScene是Vista上的一个功能,可以让你设 ...

  2. 第十四章 调试及安全性(In .net4.5) 之 对称及非对称加密

    1. 概述 本章内容包括:对称及非对称加密算法..net中的加密类.使用哈希操作.创建和管理签名认证.代码访问权限 和 加密字符串. 2. 主要内容 2.1 使用对称和非对称加密 ① 对称加密:使用同 ...

  3. Git - Tutorial [Lars Vogel]

    From: http://www.vogella.com/tutorials/Git/article.html Git - Tutorial Lars Vogel Version 5.6 Copyri ...

  4. 【原创】小白学jquery Mobile《构建跨平台APP:jQuery Mobile移动应用实战》连载五(给按钮加图标)

    在范例5-4所使用的导航栏中,已经为按钮加入了图标的样式,但是当时并没有介绍按钮的图标究竟是怎么一回事.下面截取范例5-4中导航栏部分的代码: <divdata-role="foote ...

  5. wpf的datepicker处理

    如果有2个datepicker,控制时间起和止的话,可以把第二个datepicker加一个属性,DisplayDateStart = "{Binding SelectedDate,Eleme ...

  6. Red Gate Software 软件推荐

    这家公司的Wiki http://en.wikipedia.org/wiki/Redgate http://www.red-gate.com/products/ 好吧 就介绍点免费的 Find SQL ...

  7. Express实现http和https服务

    一.介绍Http与Https 概念 HTTP: 超文本传输协议(Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文 ...

  8. Android--监听ListView滚动到最底部

    监听ListView滚动到最底部使用 onScrollStateChanged(AbsListView view, int scrollState) 方法,代码大致如下: // 监听listview滚 ...

  9. HTML5简略介绍

    今天要说下 HTML5特有的一个元素 canvas ,旨在让web页面上作矢量图不需要在依靠flash或是其他插件,在网页上使用canvas元素时,它会创建一块矩形区域,默认300*150,当然也是可 ...

  10. UITableView表视图以及重建机制

    表视图UITableView   表视图UITableView,是IOS中最重要的视图,随处可见 表视图通常用来管理一组具有相同数据结构的数据 UITableView继承自UIScrollView,所 ...