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

就拿一道题来说事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. GOOGLE 离线完整安装包下载地址

    https://support.google.com/chrome/answer/126299?hl=zh-Hans 官方链接介绍 https://www.google.com/chrome/brow ...

  2. ubuntu miss tool bar

    reson: unity exception 1. open terminal:  /usr/bin/**terminal** 2. run command on terminal: gsetting ...

  3. hdu 1872 稳定排序

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1872 稳定排序 Description 大家都知道,快速排序是不稳定的排序方法.如果对于数组中出现的任 ...

  4. umask设置导致的weblogic中的应用上传的文件没有权限打开

    去年,在公司的某一weblogic上部署的web应用上传文件后却没有读的权限.因为weblogic在Linux上部署,上传文件是mount到了一台安装了NFS的Windows Server上. 当时本 ...

  5. Javascript是一个事件驱动语言

    面向原型这种说法我没在网上找到

  6. 【ExtJs】使用Cookie、切换主题和语言

    转自:http://witmax.cn/extjs-cookie-theme-lang.html 使用Cookie:   1 2 3 Ext.state.Manager.setProvider(new ...

  7. 【AFNetworking】AFNetworking源码阅读(一)

    1. 前言 2. iOS Example代码结构 3.AFNetworkActivityIndicatorManager 4. UIRefreshControl+AFNetworking 5. AFN ...

  8. nodejs tools

    1.supervisor npm install supervisor -g supervisor app.js cd public cd bin supervisor www http://www. ...

  9. Querying mergeinfo requires version 3 of the FSFS filesystem schema

    环境: jdk 1.7; svn  3.0.4;  TortoiseSVN 1.7.13 Subversion 1.7.10; IntelliJ IDEA 13.1.1;win7 64位系统 之前那个 ...

  10. [转载]Nginx如何处理一个请求

    http://nginx.org/cn/docs/http/request_processing.html 对我的扫盲文章 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一 ...