坐标离散化技巧

题目:w*h的格子上画了n条垂直或水平的宽度为1的直线。求出这些线将格子划分成了多少个区域。

1<=w,h<=1000000.     1<=n<=500

思路:首先,一般会想到直接进行dfs或bfs,但w,h过大,无法直接搜索。坐标离散化的思想就是把有用的坐标提取出来,再建一个坐标系,把这些坐标按照顺序放在这个坐标系中。本题只需存储直线的x,y坐标和直线前后的。所以大小6n*6n就够了。


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<cmath>
#define ll __int64
#define INF 0x3fffffff
#define MAXN 105
using namespace std;

int w,h,n;
int dir[4][2]={
  {-1,0},{0,-1},{0,1},{1,0}};
int x1[MAXN],x2[MAXN],Y1[MAXN],y2[MAXN];
bool fld[MAXN*6][MAXN*6];//填充用
struct Point
{
    int x,y;
    Point(int x_=0,int y_=0):x(x_),y(y_){}
}point[MAXN*MAXN*6*6];

int compress(int *x1,int *x2,int 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值