求n个矩形面积——坐标离散化


最开始接触离散的时候是在实验室第一次暑期集训的时候,好像是wuyuqi大佬讲的,但是当时根本就没听懂这是个什么东西,感觉听名字这么高大上,有点难理解。所以当时就没花时间去研究。

这两天在补题的时候遇到了这个问题,就看了一些大佬的解释,算是有一丢丢理解了大笑

坐标离散我个人的理解就是把一个坐标平面上的有用的点保存,没有关系的点压缩(因为没有用的点对实际结果根本没有任何影响)

就以voj的1056题来做一个示范:



         这题按照最平常的想法就是把矩形内的标记,然后整个图搜索,就可以得出共覆盖了多少范围。但是范围是-10^8~10^8,这么搜显然不可能。所以要怎么样呢?


就是把有用的点保存,无关的点压缩。什么是有用的点保存,什么是无关的点压缩?给出的坐标就是有用的点,-10^8~10^8内的范围内除了给出的坐标范围其他全是没用的点,都要压缩。


有用的值其实只有这么几个。这些值将作为新的坐标值重新划分整个平面,省去中间的若干坐标值没有影响。我们可以将坐标范围“离散化”到1到200 
之间的数,于是一个200*200的二维数组就足够了。


现在用个小例子来模拟一下:

注意左边的10* 7的数组是如何等价地转化为右边两个4*4的数组的 


再就是代码实现了:

如上数据示例   x[ ]={ 1, 3, 7, 10 };

                           y[ ]={ 1,  2,  5,  7 };


按代码枚举的顺序是如上图,先看(1,1)点, if(x[i]>=x1[k]&&y[j]>=y1[k]&&x[i+1]<=x2[k]&&y[j+1]<=y2[k])判断是否是矩形内的然后按顺序枚举,发现(1,1)点不是,再看(1,2)点,s=s(x+1,y+1)-s(x,y)即框2,符合在矩形内,ans+=s,枚举完了,就得出结果了


include<cstdio>
include<cstdlib>
include<algorithm>
include<iostream>
define MAXn 100
using namespace std;
int n;
long long x1[MAXn+1],y1[MAXn+1];
long long x2[MAXn+1],y2[MAXn+1];
long long x[2MAXn+1],y[2MAXn+1];
long long S,ans;
int main()
{
    scanf("%d",&n); 
    for(int i=1;i<=n;i++) 
    { 
        scanf("%I64d%I64d%I64d%I64d",&x1[i],&y1[i],&x2[i],&y2[i]); 
        x[2i-1]=x1[i]; 
        x[2i]=x2[i]; 
        y[2i-1]=y1[i];
        y[2i]=y2[i]; 
    } 
    sort(x+1,x+2n+1); 
    sort(y+1,y+2n+1); 
    for(int i=1;i<=2n-1;i++) //枚举每一个单位横坐标,这两句看图 
        for(int j=1;j<=2n-1;j++)  //枚举每一个单位纵坐标
        { 
            S=(x[i+1]-x[i])*(y[j+1]-y[j]);
            for(int k=1;k<=n;k++) //枚举每一个矩形块 
                if(x[i]>=x1[k]&&y[j]>=y1[k]&&x[i+1]<=x2[k]&&y[j+1]<=y2[k])//这句是离散化
                { ans+=S; break; }//注意这个break,用的妙
        } 
    printf("%I64d",ans); return 0; 
}



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
时间复杂度(渐近时间复杂度的严格定义,NP问题,时间复杂度的分析方法,主定理)   排序算法(平方排序算法的应用,Shell排序,快速排序,归并排序,时间复杂度下界,三种线性时间排  序,外部排序)   数论(整除,集合论,关系,素数,进位制,辗转相除,扩展的辗转相除,同余运算,解线性同余方程,中国剩余定理) 指针(链表,搜索判重,邻接表,开散列,二叉树的表示,多叉树的表示) 按位运算(and,or,xor,shl,shr,一些应用) 图论(图论模型的建立,平面图,欧拉公式与五色定理,强连通分量,割点和桥,欧拉回路,AOV问题,AOE问题,最小生成树的三种算法,最短路的三种算法,标号法,差分约束系统,验证二分图,Konig定理,匈牙利算法,KM算法,稳定婚姻系统,最大流算法,最小割最大流定理,最小费用最大流算法) 计算几何(平面解几及其应用,向量,点积及其应用,叉积及其应用,半平面相交,点集的凸包,最近点对问题,凸多边形的交,离散化与扫描) 数据结构(广度优先搜索,验证括号匹配,表达式计算,递归的编译,Hash表,分段Hash,并查集,Tarjan算法,二叉堆,左偏树,二斜堆,二项堆,二叉查找树,红黑树,AVL平衡树,Treap,Splay,静态二叉查找树,2-d树,线段树,二维线段树,矩形树,Trie树,块状链表) 组合数学(排列与组合,鸽笼原理,容斥原理,递推,Fibonacci数列,Catalan数列,Stirling数,差分序列,生成函数,置换,Polya原理) 概率论(简单概率,条件概率,Bayes定理,期望值) 矩阵(矩阵的概念和运算,二分解线性递推方程,多米诺骨牌棋盘覆盖方案数,高斯消元) 字符串处理(KMP,后缀树,有限状态自动机,Huffman编码,简单密码学) 动态规划(单调队列,凸完全单调性,树型动规,多叉转二叉,状态压缩类动规,四边形不等式) 博奕论(Nim取子游戏,博弈树,Shannon开关游戏) 搜索(A*,ID,IDA*,随机调整,遗传算法)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值