Aizu 0531 "Paint Color" (坐标离散化+DFS or BFS)
题目描述:
为了宣传信息竞赛,要在长方形的三合板上喷油漆来制作招牌。
三合板上不需要涂色的部分预先贴好了护板。
被护板隔开的区域要涂上不同的颜色,比如上图就应该涂上5种颜色。
请编写一个程序计算涂色数量,输入数据中,保证看板不会被护板全部遮住,并且护板的边一定是水平或垂直的。 Input
第一个数是宽w( ≤ w ≤ );
第二个数是高h( ≤ h ≤ )。
第二行是护板的数量n( ≤ n ≤ );
接着n行是每个护板的左下角坐标 (x1 , y1 )和右上角坐标 (x2 , y2 ),用空格隔开: x1 , y1 , x2 , y2 ( ≤ x1< x2 ≤ w, ≤ y1 < y2 ≤ h 都是整数)
招牌的坐标系左下角是 (, ) ,右上角是(w, h)
Output
颜色的数量
中文题目描述
中文题目描述摘抄自:https://blog.csdn.net/a1097304791/article/details/89707471
参考资料:
[1]:挑战程序设计竞赛(第二版)
题解:
坐标离散化+DFS求联通块个数;
注意:需要的是联通空格的个数,转化的时候需要注意 < 右边界,而不能等于;
#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
const int maxn=1e3+; int n;
int w,h;
bool vis[*maxn][*maxn];
struct Point
{
int x,y;
}p[maxn],f,e;
int dx[]={,,-,};
int dy[]={,-,,};
vector<int >vs[]; int BS(int l,int r,int x,int val)
{
int mid=l+((r-l)>>);
while(vs[x][mid] != val)
{
if(vs[x][mid] > val)
r=mid;
else
l=mid;
mid=l+((r-l)>>);
}
return mid;
}
void Compress()
{
vs[].clear();
vs[].clear();
for(int i=;i <= *(n+);++i)
{
for(int d=-;d <= ;++d)
{
vs[].push_back(p[i].x+d);///离散化x
vs[].push_back(p[i].y+d);///离散化y
}
}
sort(vs[].begin(),vs[].end());
sort(vs[].begin(),vs[].end());
vs[].erase(unique(vs[].begin(),vs[].end()),vs[].end());
vs[].erase(unique(vs[].begin(),vs[].end()),vs[].end()); for(int i=;i <= *(n+);++i)
{
p[i].x=BS(,vs[].size(),,p[i].x);///手动二分查找
p[i].y=BS(,vs[].size(),,p[i].y);
// p[i].x=find(vs[0].begin(),vs[0].end(),p[i].x)-vs[0].begin();
// p[i].y=find(vs[1].begin(),vs[1].end(),p[i].y)-vs[1].begin();
}
f=p[*n+];
e=p[*n+];
}
bool isSat(int x,int y)
{
return x >= f.x && x < e.x && y >= f.y && y < e.y;
}
void DFS(int x,int y)
{
vis[x][y]=true;
for(int i=;i < ;++i)
{
int nexX=x+dx[i];
int nexY=y+dy[i];
if(!isSat(nexX,nexY) || vis[nexX][nexY])
continue;
DFS(nexX,nexY);
}
}
ll Solve()
{
Compress();
mem(vis,false);
for(int k=;k <= n;++k)
{
for(int i=p[k].x;i < p[k+n].x;++i)///严格小于右边界
for(int j=p[k].y;j < p[k+n].y;++j)///严格小于右边界
vis[i][j]=true;
}
ll ans=;
for(int i=f.x;i < e.x;++i)///严格小于右边界
for(int j=f.y;j < e.y;++j)///严格小于右边界
if(!vis[i][j])
{
ans++;
DFS(i,j);
}
return ans;
}
int main()
{
// freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin);
while(~scanf("%d%d",&w,&h) && w+h)
{
scanf("%d",&n);
for(int i=;i <= n;++i)
{
scanf("%d%d",&p[i].x,&p[i].y);
scanf("%d%d",&p[i+n].x,&p[i+n].y);
}
p[*n+]=Point{,};
p[*n+]=Point{w,h}; printf("%lld\n",Solve());
}
return ;
}
之所以做这道题,是因为省赛的时候,某题错解,用了离散化,按照书上写的find()函数,超时;
自己手写了个二分,返回了其他错误;
得出的结论是手写的二分 快于 find() 的时间复杂度;
tel me why?????
Aizu 0531 "Paint Color" (坐标离散化+DFS or BFS)的更多相关文章
- Aizu - 0531 Paint Color
白书例题,直接用书上的暴力压缩坐标是可以的,但是看了别人的博客的写法,大概是理解了思想但是看不懂为什么那么压缩,先放这,等明白了补上 #define debug #include<stdio.h ...
- Greedy:Paint Color(AOJ 0531)
涂颜料 题目大意:在一个1000000*1000000的矩阵中放入几块木板,问你这些木板把矩阵划分成了几个区域?输入会给左下角和右上角的坐标,输入W==0且H==0结束. 这一题是书上的作业题,书上有 ...
- AOJ 0531 坐标离散化
涂色:(日文题目,自己翻译成了中文)为了宣传信息竞赛,要在长方形的三合板上喷油漆来制作招牌.三合板上不需要涂色的部分预先贴好了护板.被护板隔开的区域要涂上不同的颜色,比如上图就应该涂上5种颜色. 请编 ...
- hdu4605 树状数组+离散化+dfs
Magic Ball Game Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- hdu 3478 Catch(染色 dfs 或 bfs )
Problem Description A thief is running away! We can consider the city to N–. The tricky thief starts ...
- 图论中DFS与BFS的区别、用法、详解…
DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...
- 图论中DFS与BFS的区别、用法、详解?
DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...
- 邻接矩阵实现图的存储,DFS,BFS遍历
图的遍历一般由两者方式:深度优先搜索(DFS),广度优先搜索(BFS),深度优先就是先访问完最深层次的数据元素,而BFS其实就是层次遍历,每一层每一层的遍历. 1.深度优先搜索(DFS) 我一贯习惯有 ...
- DFS和BFS模板
DFS: 该DFS框架以2D坐标范围为例,来体现DFS算法的实现思想 #include<cstdio> #include<cstring> #include<cstdli ...
随机推荐
- Unicode, UTF-8, GBK, ASCII的区别
看完知乎的两篇文章大概就明白了 https://zhuanlan.zhihu.com/p/25435644 https://www.zhihu.com/question/23374078 看完总结一下 ...
- 安装LoadRunner11时,缺少vc2005_sp1_with_atl_fix_redist错误的解决方案
安装LoadRunner11时,会报缺少vc2005_sp1_with_atl_fix_redist错误,类似下图所示: 由提示信息可知,这里是由于本机缺少该组件所致,解决方案就是安装此组件,可以去网 ...
- 2019-10-26-Inno-Setup-安装包脚本-Run-的-Flags-标记
title author date CreateTime categories Inno Setup 安装包脚本 Run 的 Flags 标记 lindexi 2019-10-26 08:42:39 ...
- PLAY2.6-SCALA(五) Action的组合、范围的设置以及错误的处理
一.自定义action 从一个日志装饰器的例子开始 1.在invokeBlock方法中实现 import play.api.mvc._ class LoggingAction @Inject() (p ...
- hdu1527 威佐夫博奕
有2堆石子,有2个人,每个人可以从一堆取或从2堆取一样的个数的石子,至少取1个.问先手的是胜或输.设(ak,bk)我么成为局势. (0,0)(1,2)(3,5)(4,7)..这种先手必输的叫奇异局势. ...
- ANSI编码方式转化为UTF-8方式
说明: 记事本txt有四种编码方式,分别为:UTF-8.ANSI.Unicode和Unicode big endian,当进行写操作,创建的txt编码格式,与写入汉字的编码方式相同:如果写入的汉字是不 ...
- Java练习 SDUT-2728_最佳拟合直线
最佳拟合直线 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在很多情况下,天文观测得到的数据是一组包含很大数量的序列点 ...
- 从零学React Native之10Text
在React Native开发中,所有需要显示的字符串文本都需要放置在Text或者Text的子组件中.虽然在之前的文章中多次使用了Text组件,但是Text组件还是值得专门学习的, 并没有想象中的那么 ...
- Alternating Direction Method of Multipliers -- ADMM
前言: Alternating Direction Method of Multipliers(ADMM)算法并不是一个很新的算法,他只是整合许多不少经典优化思路,然后结合现代统计学习所遇到的问题,提 ...
- 洛谷P2504 [HAOI2006]聪明的猴子
#include<bits/stdc++.h> using namespace std; ; ; int n,m,k,ans; double Max; int monkey[maxn]; ...