坐标离散化处理

<pre name="code" class="cpp">#include <bits/stdc++.h>

using namespace std;
#define maxn 505
typedef pair<int, int> P;

int W, H, N;
int X1[maxn], X2[maxn], Y1[maxn], Y2[maxn];
bool fld[maxn][maxn];
int d[2][4] = {{-1, 0, 1, 0}, {0, -1, 0, 1}};

int compress(int *x1, int *x2, int w)
{
    vector<int> xs;

    for(int i=0; i<N; i++)
        for(int d=-1; d<=1; d++)
        {
            int xx1 = x1[i] + d;
            int xx2 = x2[i] + d;
            if(xx1>=1 && xx1<=w) xs.push_back(xx1);
            if(xx2>=1 && xx2<=w) xs.push_back(xx2);
        }

    sort(xs.begin(), xs.end());
    xs.erase(unique(xs.begin(), xs.end()), xs.end());

    for(int i=0; i<N; i++)
    {
        x1[i] = find(xs.begin(), xs.end(), x1[i]) - xs.begin();
        x2[i] = find(xs.begin(), xs.end(), x2[i]) - xs.begin();
    }

    return xs.size();
}

void solve()
{
    memset(fld, false, sizeof(fld));

    W = compress(X1, X2, W);
    H = compress(Y1, Y2, H);

    for(int i=0; i<N; i++)
        for(int y=Y1[i]; y<=Y2[i]; y++)
            for(int x=X1[i]; x<=X2[i]; x++)
                fld[y][x] = true;

    for(int y=0; y<H; y++)
    {
        for(int x=0; x<W; x++)
            cout<<fld[y][x]<<" ";
        cout<<endl;
    }

    int cnt = 0;
    for(int y=0; y<H; y++)
        for(int x=0; x<W; x++)
            if(!fld[y][x])
            {
                cnt++;
                queue<P> que;
                que.push(make_pair(y, x));

                while(!que.empty())
                {
                    P p = que.front();
                    que.pop();
                    for(int i=0; i<4; i++)
                    {
                        int ty = p.first + d[0][i];
                        int tx = p.second + d[1][i];

                        while(tx>=0 && tx<W && ty>=0 && ty<H && !fld[ty][tx])
                        {
                            fld[ty][tx] = true;
                            que.push(make_pair(ty, tx));
                        }
                    }
                }
            }

    cout<<cnt<<endl;
}

int main()
{
    while(~scanf("%d%d", &W, &H) && W + H)
    {
        cin>>N;
        for(int i=0; i<N; i++)
            scanf("%d", &X1[i]);
        for(int i=0; i<N; i++)
            scanf("%d", &X2[i]);
        for(int i=0; i<N; i++)
            scanf("%d", &Y1[i]);
        for(int i=0; i<N; i++)
            scanf("%d", &Y2[i]);

        solve();
    }
    return 0;
}

/*
10 10 5
1 1 4 9 10
6 10 4 9 10
4 8 1 1 6
4 8 10 5 10
*/
				
时间: 2025-01-12 18:24:59

坐标离散化处理的相关文章

【坐标离散化】

坐标离散化 (来自<挑战程序设计竞赛>P164)给出题目和主体代码: 题目:区域的个数w*h的格子上画了n条或垂直或水平的宽度为1的直线.求出这些线将格子划分了多少个区域(w和h的范围都为[1, 1e6],n的范围为[1,500]) 思路:一般先想到的是类似水塘问题的处理,建立数组并深度优先搜索但是这个问题中w和h最大为1000000,所以没办法创建w*h的数组.因此我们要使用坐标离散化这一技巧 将前后没有变化的行列(意思是消除后不会影响区域个数的)相除后并不会影响区域的个数数组里只需要存储有

区域的个数(坐标离散化)

始终觉得秋叶拓哉书上那段代码,没有起到离散化的作用啊?估计是我智障吧...肯定是. compress 后的 X,Y 坐标绘制的 field 和原来的地图一样啊.到底为森么呢?到底为森么呢? import pprint def compress( li1, li2, size, nums ): vec = [] vec1 = [] for i in xrange( nums ): for d in xrange( -1, 2 ): temp1, temp2 = li1[i] + d, li2[i]

【坐标离散化】AOJ0531- Paint Color

日文题--一开始被题目骗了以为真的要写文件? 题目大意&&解答戳:? 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 #include<vector> 7 #include<queue> 8 using namespace std; 9 int w,

hihoCoder#1079(线段树+坐标离散化)

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho所在的学校举办社团文化节,各大社团都在宣传栏上贴起了海报,但是贴来贴去,有些海报就会被其他社团的海报所遮挡住.看到这个场景,小Hi便产生了这样的一个疑问——最后到底能有几张海报还能被看见呢? 于是小Ho肩负起了解决这个问题的责任:因为宣传栏和海报的高度都是一样的,所以宣传栏可以被视作长度为L的一段区间,且有

坐标离散化

int compress(int *x1,int *x2,int w){ vector<int> xs; for(int i=0;i<N;i++){ for(int d=-1;d<=1;d++){ int tx1=x1[i]+d,tx2=x2[i]+d; if(1<=tx1&&tx1<=w) xs.push_back(tx1); if(1<=tx2&&tx2<=w) xs.push_back(tx2); } } sort(xs

坐标离散化注意点

1.获得有几个不同的点&获得点在数组中的位置(为了从1开始计数): int totalX = unique(keyX.begin(), keyX.end()) - keyX.begin(); p[i].x = lower_bound(keyX.begin(), keyX.begin() + totalX, p[i].x) - keyX.begin() +1; len1 = unique(b + 1, b + 1 + len1) - (b + 1); p[i].x = lower_bound(b

[UVALive 6663 Count the Regions] (dfs + 离散化)

链接:https://icpcarchive.ecs.baylor.edu/index.php? option=com_onlinejudge&Itemid=8&page=show_problem&problem=4675 题目大意: 在一个平面上有 n (1<=n<=50) 个矩形.给你左上角和右下角的坐标(0<=x<=10^6, 0<=y<=10^6).问这些矩形将该平面划分为多少块. 解题思路: 因为n非常小,能够对整个图进行压缩.仅仅要不

HDU 1542 Atlantis 线段树+离散化+扫描线

题意:给出一些矩形的最上角坐标和右下角坐标,求这些矩形的面积并. NotOnlySuccess 线段树专辑中扫描线模板题,弱智的我对着大大的代码看了一下午才搞懂. 具体见思路见注释=.= #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #define lson rt<<1,l,mid #define rson rt<<1|1,mid

POJ 1151 Atlantis 线段树+离散化

题目链接:http://poj.org/problem?id=1151  http://acm.hdu.edu.cn/showproblem.php?pid=1542 题目大意:给你几个矩形的坐标,求他们的面积的并. 解题思路:可以参考http://www.cnblogs.com/kuangbin/archive/2011/08/16/2140544.html,实际上就是一个方向直接算出,另一个方向使用线段树维护已经覆盖的底边的长度.具体操作不算复杂:假想一条扫描下从下往上开始进行扫描,初始时候