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

就拿一道题来说事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;

等下在结合代码看看,

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

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

最后统计;

  1. #include<iostream>
  2. #include <algorithm>
  3. #include<string.h>
  4. #include<cstdio>
  5. #include<math.h>
  6. using namespace std;
  7. double x[],y[],s[][];
  8. int xy[][];
  9. int n,cas=;
  10. double sum;
  11. int main()
  12. {
  13. int i,j,k;
  14. while(cin>>n)
  15. {
  16. if(n==) break;
  17. cas++;
  18. k=;
  19. sum=0.0;
  20. memset(xy,,sizeof(xy));
  21.  
  22. for(i=;i<=n;i++)
  23. {
  24. cin>>s[i][]>>s[i][]>>s[i][]>>s[i][];
  25. x[k]=s[i][];
  26. y[k]=s[i][];
  27. k++;
  28. x[k]=s[i][];
  29. y[k]=s[i][];
  30. k++;
  31. }
  32. sort(x,x+*n);
  33. sort(y,y+*n);
  34.  
  35. for (int i=;i<=n;i++)
  36. {
  37. int i1=lower_bound(x,x+*n,s[i][])-x;//二分查找,跟普通的FOR语句一样
  38. int j1=lower_bound(y,y+*n,s[i][])-y;
  39. int i2=lower_bound(x,x+*n,s[i][])-x;
  40. int j2=lower_bound(y,y+*n,s[i][])-y;
  41. for (int p1=i1;p1<i2;p1++)//标记状态,记住我们是以一个方块的角标记状态所以p1<i2,不是<=
  42. for (int p=j1;p<j2;p++)
  43. xy[p1][p]=;
  44. }
  45. for (int i=;i<*n;i++)//统计
  46. for (int j=;j<*n;j++)
  47. if (xy[i][j]) {
  48. sum+=(x[i+]-x[i])*(y[j+]-y[j]);
  49. }
  50. printf("Test case #%d\n",cas);
  51. printf("Total explored area: %.2f\n",sum);
  52. printf("\n");
  53. }
  54. return ;
  55. }

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

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

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

好吧!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

  1. 2
  2. 6 6 5
  3. 0 0
  4. 0 1
  5. 1 1
  6. 2 0
  7. 2 1
  8. 1 0 5 5
  9. 6 6 4
  10. 0 0
  11. 0 1
  12. 2 0
  13. 2 1
  14. 1 0 5 5

Sample Output

  1. Case 1: NO
  2. Case 2: YES
  3.  
  4. 这题是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. VB 进制转换大全

    '二进制转十进制 Public Function B2D(vBStr As String) As Long Dim vLen As Integer '串长 Dim vDec As Long '结果 D ...

  2. Css 书写规范【转】

    1. 不同浏览器元素的默认属性有所不同,使用Reset可重置浏览器元素的一些默认属性,以达到浏览器的兼容. /** 清除内外边距 **/ body, h1, h2, h3, h4, h5, h6, h ...

  3. 装黑苹果的那些事儿(以ThinkpadE540为例)

    苹果系统,有着比window更好的安全性和方便性,更重要的事,没有MAC系统环境,进行iOS开发,是很麻烦的,对新手来说,是很懊恼的一件事.但是白苹果像件奢侈品,吾等常人,很难有经济消费.如是黑苹果是 ...

  4. 算法系列5《SSF33》

    SSF33算法是以128位分组为单位进行运算,密钥长度为16字节,该算法也可以被用于安全报文传送和MAC机制密文运算. 使用SSF33算法和基于3-DES的对称加密机制使用相同长度的密钥,能够同原有的 ...

  5. poj 3259 Wormholes

    题目连接 http://poj.org/problem?id=3259 Wormholes Description While exploring his many farms, Farmer Joh ...

  6. JavaScript 将多个引用(样式或者脚本)放入一个文件进行引用

    1.将样式放入一个文件进行引用 @import url("../media/css/bootstrap.min.css"); @import url("../media/ ...

  7. Menu MenuItem

    Menu & MenuItem learning note Menu MenuItem MSDN Sample Code <Menu Grid.Row="0" Hor ...

  8. layer 弹出子页面然后给父页面赋值

    //----赋值 并关闭当前页面 开始---- FunctionActionDeleteXZ = function (CompanyId, RelCompanyName) { parent.$(&qu ...

  9. netstat用法

    netstat - 显示网络连接,路由表,接口状态,伪装连接,网络链路信息和组播成员组. 总 netstat [address_family_options] [--tcp|-t] [--udp|-u ...

  10. oracle11g创建数据库最后一步确定时弹出无法创建目录

    总的说是Windows7的权限问题 Windows7 dos命令下输入dbca创建数据库,因为权限问题,数据库将无法完成.所以还是在开始程序中打开dbca创建数据库比较好. Windows7 dos以 ...