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 ...
随机推荐
- 斯坦福CS课程列表
http://exploredegrees.stanford.edu/coursedescriptions/cs/ CS 101. Introduction to Computing Principl ...
- 【Leetcode 堆、快速选择、Top-K问题 BFPRT】有序矩阵中第K小的元素(378)
题目 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素. 请注意,它是排序后的第k小元素,而不是第k个元素. 示例: matrix = [ [ 1, 5, 9], [ ...
- Spring boot通过JPA访问MySQL数据库
本文展示如何通过JPA访问MySQL数据库. JPA全称Java Persistence API,即Java持久化API,它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据 ...
- Linux进程管理(一、 基本概念和数据结构)
被问到两个问题, 后来想了下如果要讲明白还不太容易,需要对进程的概念,进程管理有清晰的认识: 1. 父进程打开了一个文件,然后通过fork创建一个子进程, 子进程是否共享父进程的文件描述符? 2. 在 ...
- Apache CarbonData1.3简介
CarbonData是一种高性能大数据存储方案,支持快速过滤查找和即席OLAP分析,已在20+企业生产环境上部署应用,其中最大的单一集群数据规模达到几万亿.针对当前大数据领域分析场景需求各异而导致的存 ...
- n!素因子p的幂 swjtuOJ 2090【数论】
原文地址:http://blog.csdn.net/u012717411/article/details/47334969(感谢作者) 素因子分解写的非常好!数论一道好题:给以两个大整数n,s(n&l ...
- 反射技术的入口 获取类的Class信息
package com.sxt.reflect; import com.sxt.reflect.entity.Student; /* * 获取类的Class信息 */ public class Tes ...
- 谷歌好样的,把 www 也干掉了
谷歌好样的,把 www 也干掉了 继把 http 干掉后,这次 Chrome 76 连 https 和 www 都一起干掉了. 喜欢简洁,但这个功能演化过程可不简单. 最早觉得把 http 干掉很不方 ...
- hdu 6201 【树形dp||SPFA最长路】
http://acm.hdu.edu.cn/showproblem.php?pid=6201 n个城市都在卖一种书,该书的价格在i城市为cost[i],商人打算从某个城市出发到另一个城市结束,途中可以 ...
- UVa 10323 【数学】
UVa 10323 题目:计算阶乘在10000~6227020800之间的值,不在范围对应输出Under或者Over. 分析:简单题.数论.因为13!=6227020800,7!<10000&l ...