离散-ACM一道强有力的工具
最近几天散搞哭了,都怪以前看到没好好学。。。
就拿一道题来说事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的题解让我抄的体无完肤。哈哈。
何为离散:
我的总结是将我们不能直接处理的点的关系对应于其他关系,也就是说离散后的点之间的关系并没有改变。
这是必须的条件。
先来题目:
Input
Note: The starting place and the exit will not have trees there.
Output
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一道强有力的工具的更多相关文章
- ACM一道关于素数查找的题
在ACM做这么一道题: 我用了最简单的查找素数的方法: bool isPrime(int n) { int t=n-1; while(t>2) { if(n%t==0) { return fal ...
- [原创]使用命令行工具提升cocos2d-x开发效率(二)之CocosBuilder篇
如果你正在使用CocosBuilder或者是其他基于CocosBuilder源码改装而成的工具为你的游戏搭建场景或者UI,那你一定要看看这篇文章:) 你是否已经厌倦了无聊的手工publish操作? ...
- 使用命令行工具提升cocos2d-x开发效率 之CocosBuilder篇
http://www.cnblogs.com/flyFreeZn/p/3617983.html 假设你正在使用CocosBuilder或者是其它基于CocosBuilder源代码改装而成的工具为你的游 ...
- ETL工具-informatica产品部分功能、接口采购梳理
在项目中,经常遇到要进行产品采购,虽然一直在使用informatica工具做数据的抽取.清晰转换.加载,但是使用的功能也比较初级.在遇到采购时大致的进行了梳理. 序号 名称 产品功能说明 产品选配说明 ...
- spark机器学习从0到1基本的统计工具之(三)
给定一个数据集,数据分析师一般会先观察一下数据集的基本情况,称之为汇总统计或者概要性统计.一般的概要性统计用于概括一系列观测值,包括位置或集中趋势(比如算术平均值.中位数.众数和四分位均值),展型 ...
- 现代工程仿真CAE技术介绍
随着现代科学技术的发展,人们正在不断建造更为快速的交通工具.更大规模的建筑物.更大跨度的桥梁.更大功率的发电机组和更为精密的机械设备.这一切都要求工程师在设计阶段就能精确地预测出产品和工程的技术性能, ...
- Neural ODE相关论文摘要翻译
*****仅供个人学习记录***** Neural Ordinary Differential Equations[2019] 论文地址:[1806.07366] Neural Ordinary Di ...
- 前端学HTTP之URL
× 目录 [1]URI [2]URL语法 [3]字符[4]编码方法 前面的话 一般地,URL和URI比较难以区分.接下来,本文以区分URL和URI为引子,详细介绍URL的用法 URI与URL的区别 U ...
- javascript正则表达式(RegExp)简述
首先我们来思考以下两个个场景 我们使用window操作系统,有时候需要找一个文件,刚刚好这个文件我不知道放哪里去了,这个时候我们该怎么办呢? 我们使用word写论文的时候,不小心将"订价&q ...
随机推荐
- spark概论
一.概述 1.轻:(1)采用语言简洁的scala编写:(2)利用了hadoop和mesos的基础设施 2.快:spark的内存计算.数据本地性和传输优化.调度优化,使其在迭代机器学习,ad-hoc ...
- PHP+MYSQL会员系统的开发实例教程
本文通过一个简单的实例完成了完整的PHP+MySQL会员系统功能.是非常实用的一个应用.具体实现步骤如下: 一.会员系统的原理: 登陆-->判断-->保持状态(Cookie或Session ...
- 10-排序5 PAT Judge
用了冒泡和插入排序 果然没有什么本质区别..都是运行超时 用库函数sort也超时 The ranklist of PAT is generated from the status list, whic ...
- AngularJs记录学习01
<!doctype html> <html ng-app="myapp"> <head> <meta http-equiv="C ...
- 【微信平台&后台管理】第一个外包项目:XX科技城微信平台项目总结
苍天有眼啊,学了半年的网站开发终于派上用处,终于能赚钱了啊. 这个项目是和学长一起做的,项目的甲方是大庆某房地产土豪,项目要求就是搭建一整套的微信平台和微信平台管理系统,具体要求就是:回复关键字能拿到 ...
- 从数组->ArrayList->List 为了方便与安全在不断变化着
在C#中,当我们想要存储一组对象的时候,就会想到用数组,ArrayList,List这三个对象了. 数组 优点优点之一:数组在内存中是连续存储的,所以它的索引速度是非常的快,而且赋值与修改元素也很简单 ...
- .net 日期格式化
有时候我们要对时间进行转换,达到不同的显示效果 默认格式为:2005-6-6 14:33:34 如果要换成成200506,06-2005,2005-6-6或更多的该怎么办呢 我们要用到:DateTim ...
- Linux下Nginx的安装与配置
安装前需要安装pcre:ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/1.解压缩: tar xjpf pcre-7.8.tar.b ...
- Entity Framework 学习第二天
今天记录的内容不多,只是简单用一下Model first,新建项目,然后添加新建项,选择数据中的ado.net实体数据模型 这次我们选择空模型,然后右键,新增,实体 在这项demo中我打算建两个数据实 ...
- P1233: [Usaco2009Open]干草堆tower
这道题,首先想到的就两个,一是贪心,二是动规,然而 1<=N<=100000;1<=w_i<=10000 的数据范围实在不敢恭维,所以说第一想法是错的.仔细一想,首先,我们需要 ...