坐标离散化

Posted zuimeiyujianni

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了坐标离散化相关的知识,希望对你有一定的参考价值。

#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
int w,h,n;
const int maxn = 500;
int x1[maxn],x2[maxn],y1[maxn],y2[maxn];
bool fld[maxn*6][maxn*6];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0}; 
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.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()
{
    w = compress(x1,x2,w);
    h = compress(y1,y2,h);
    memset(fld,0,sizeof(fld));
    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;
            }
        }
    }
    int ans=0;
    for(int y=0;y<h;y++)
    {
        for(int x=0;x<w;x++)
        {
            if(fld[y][x]) continue;
            ans++;
            
            queue<pair<int,int> >que;
            que.push(make_pair(x,y));
            while(!que.empty())
            {
                int sx = que.front().first;
                int sy = que.front().second;
                que.pop();
                
                for(int i=0;i<4;i++)
                {
                    int tx=sx+dx[i],ty=sy+dy[i];
                    if(tx<0 || w<=tx || ty<0 || h<=ty) continue;
                    if(fld[ty][tx]) continue;
                    que.push(make_pair(tx,ty));
                    fld[ty][tx]=true;    
                }    
            } 
        }
    }
    cout  << ans;
}
int main(void)
{
    cin >> w >> h >> n;
    for(int i=0;i<n;i++) cin >> x1[i];
    for(int i=0;i<n;i++) cin >> x2[i];
    for(int i=0;i<n;i++) cin >> y1[i];
    for(int i=0;i<n;i++) cin >> y2[i];
    solve(); 
    return 0;
}

 

技术分享图片

 

以上是关于坐标离散化的主要内容,如果未能解决你的问题,请参考以下文章

hdu1542线段树(扫描线+离散化)

二位平面坐标的离散化

算法复习之坐标离散化

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

坐标离散化

坐标离散化