【坐标离散化】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,h,n,ans;
 10 const int MAXN=1000+10;
 11 int x1[MAXN],x2[MAXN],y1[MAXN],y2[MAXN];
 12 int hashx[MAXN*2],hashy[MAXN*2];
 13 int fld[MAXN*2][MAXN*2];
 14 int dx[4]={0,0,1,-1};
 15 int dy[4]={1,-1,0,0};
 16
 17 void compress()
 18 {
 19     int tx=0,ty=0;
 20     for (int i=1;i<=n;i++)
 21     {
 22         hashx[++tx]=x1[i];hashx[++tx]=x2[i];
 23         hashy[++ty]=y1[i];hashy[++ty]=y2[i];
 24     }
 25     hashx[++tx]=0;hashx[++tx]=w;
 26     hashy[++ty]=0;hashy[++ty]=h;
 27     sort(hashx+1,hashx+tx+1);
 28     sort(hashy+1,hashy+ty+1);
 29     w=unique(hashx+1,hashx+tx+1)-(hashx+1);
 30     h=unique(hashy+1,hashy+ty+1)-(hashy+1);
 31     for (int i=1;i<=n;i++)
 32     {
 33         x1[i]=lower_bound(hashx+1,hashx+w+1,x1[i])-hashx-1;
 34         x2[i]=lower_bound(hashx+1,hashx+w+1,x2[i])-hashx-1;
 35         y1[i]=lower_bound(hashy+1,hashy+h+1,y1[i])-hashy-1;
 36         y2[i]=lower_bound(hashy+1,hashy+h+1,y2[i])-hashy-1;
 37     }
 38     w--;h--;
 39 }
 40
 41 void init()
 42 {
 43     scanf("%d",&n);
 44     for (int i=1;i<=n;i++)
 45         scanf("%d%d%d%d",&x1[i],&y1[i],&x2[i],&y2[i]);
 46     compress();
 47 }
 48
 49 void imos()    /*imos?*/
 50 {
 51     memset(fld,0,sizeof(fld));
 52     for (int i=1;i<=n;i++)
 53     {
 54         fld[x1[i]][y1[i]]++;
 55         fld[x2[i]][y2[i]]++;
 56         fld[x1[i]][y2[i]]--;
 57         fld[x2[i]][y1[i]]--;
 58     }
 59
 60     for (int i=0;i<w;i++)
 61         for (int j=1;j<h;j++)
 62             fld[i][j]+=fld[i][j-1];
 63
 64     for (int j=0;j<h;j++)
 65         for (int i=1;i<w;i++)
 66             fld[i][j]+=fld[i-1][j];
 67 }
 68
 69 void bfs(int x,int y)
 70 {
 71     ans++;
 72     queue<int> qx,qy;
 73     qx.push(x);
 74     qy.push(y);
 75     fld[x][y]=1;
 76     while (!qx.empty())
 77     {
 78         int xx=qx.front();qx.pop();
 79         int yy=qy.front();qy.pop();
 80         for (int i=0;i<4;i++)
 81         {
 82              int nx=xx+dx[i],ny=yy+dy[i];
 83              if (nx<0 || ny<0 || nx>w || ny>h || fld[nx][ny]>0) continue;
 84              qx.push(nx);
 85              qy.push(ny);
 86              fld[nx][ny]=1;
 87         }
 88     }
 89 }
 90
 91 void solve()
 92 {
 93     ans=0;
 94     for (int i=0;i<w;i++)
 95         for (int j=0;j<h;j++)
 96             if (fld[i][j]==0) bfs(i,j);
 97     printf("%d\n",ans);
 98 }
 99
100 int main()
101 {
102     //freopen("input.txt","r",stdin);
103     //freopen("output.txt","w",stdout);
104     while (~scanf("%d%d",&w,&h)&&w&&h)
105     {
106         init();
107         imos();
108         solve();
109     }
110     return 0;
111 } 
时间: 2024-12-10 16:47:26

【坐标离散化】AOJ0531- Paint Color的相关文章

Android中自定义常用的三个对象解析(Paint,Color,Canvas)

Paint,Color,Canvas Paint:画笔对象,画图用的"笔" Color:颜色,相当于调料 Canvas:画布,现实中的纸板 Paint 画笔 常用的方法就是设置和获取到画笔的样式: paint.setStyle(); 设置画笔的风格,空心的或者是实心的 paint.setColor(); 设置画笔的颜色 paint.setStrokeWidth(); 设置边框线的宽度 paint.setAlpha(); 设置画笔的Alpha值 paint.setAntiAlias();

Greedy:Paint Color(AOJ 0531)

涂颜料 题目大意:在一个1000000*1000000的矩阵中放入几块木板,问你这些木板把矩阵划分成了几个区域?输入会给左下角和右上角的坐标,输入W==0且H==0结束. 这一题是书上的作业题,书上有一道差不多的例题,但是书上那道例题是用的直线的,而且他的坐标是点格,而这道题是坐标(这个很重要,我一开始没有区分好导致理解不了).那么这一题肯定要用到坐标压缩的(1000000*1000000太大了,我们可以把木板压缩到最小就可以了),标准的直接看代码就好了,很容易理解. 然后现在这题很难的一个地方

【坐标离散化】

坐标离散化 (来自<挑战程序设计竞赛>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]

AOJ 0531:Paint Color(二维离散+imos)

[题目链接] http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0531 [题目大意] 给出一张图,和一些矩形障碍物,求该图没被障碍物覆盖的部分被划分为几个连通块 [题解] 首先对图中的点进行离散化,对于一个障碍物来说, 我们将其看做左闭右开上闭下开的图形,所以在离散的时候只要离散障碍物的点即可. 之后我们利用imos积累法得出哪些部分是障碍物,就可以统计连通块了. [代码] #include <cstdio> #include

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

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

坐标离散化处理

<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,

坐标离散化

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