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 ...
随机推荐
- Linux与Unix shell编程指南(完整高清版).pdf
找到一本很详细的Linux Shell脚本教程,其实里面不光讲了Shell脚本编程,还介绍了系统的各种命令 http://vdisk.weibo.com/s/yVBlEojGMQMpv 本书共分五部分 ...
- JAVA-WEB-错误之-'OPTION SQL_SELECT_LIMIT=DEFAULT'
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version ...
- oracle限制一个用户空闲时间
alter system set resource_limit = true; create profile idletime limit idle_time 3; alter user outln ...
- 【转载】获取更多/proc/fd中有关socket的信息
Q: Looking in /proc/$mypid/fd/, I see these files lrwx------ cm_user cm_user Oct : -> /dev/pts/ ( ...
- 比较全面的一个PHP缓存类解析
转自:http://www.blhere.com/1164.html 一.引论 PHP,一门最近几年兴起的web设计脚本语言,由于它的强大和可伸缩性,近几年来得到长足的发展,php相比传统的asp网站 ...
- Windows中查看PowerShell版本和virbox版本,vagrant 版本
我并不是很熟悉什么是PowerShell,但是有种直觉是:如果想在Windows中使用系统自带的功能取代bash shell,PowerShell或许是比DOS批处理更好的选择.不过,从头开始再来一门 ...
- 微信小程序错误——mpvue小程序:未找到 app.json 中的定义的 pages "pages/XXX/XXX" 对应的 WXML 文件
背景 在刚开始学习开发小程序时,使用微信开发工具在app.json建立页面,写好配置文件名称后,应该会自动生成页面的4个文件,结果没有生成文件,反而报错:mpvue小程序:未找到 app.json 中 ...
- win10下Anaconda3配置环境变量
有时候在win10安装好Anaconda3后,使用conda命令时依然会出现: C:\Users\dell\PycharmProjects\pytorch>conda list 'conda' ...
- UVA_489:Hangman Judge
Language:C++ 4.8.2 #include<stdio.h> #include<string.h> int main(void) { ]; ]; ]; ]; // ...
- 洛谷P2820 局域网
#include<bits/stdc++.h> using namespace std; ; ; int n,k,sum,tot; struct node{ int cnt,fa; }f[ ...