传送门

题目描述:
为了宣传信息竞赛,要在长方形的三合板上喷油漆来制作招牌。
三合板上不需要涂色的部分预先贴好了护板。
被护板隔开的区域要涂上不同的颜色,比如上图就应该涂上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)的更多相关文章

  1. Aizu - 0531 Paint Color

    白书例题,直接用书上的暴力压缩坐标是可以的,但是看了别人的博客的写法,大概是理解了思想但是看不懂为什么那么压缩,先放这,等明白了补上 #define debug #include<stdio.h ...

  2. Greedy:Paint Color(AOJ 0531)

    涂颜料 题目大意:在一个1000000*1000000的矩阵中放入几块木板,问你这些木板把矩阵划分成了几个区域?输入会给左下角和右上角的坐标,输入W==0且H==0结束. 这一题是书上的作业题,书上有 ...

  3. AOJ 0531 坐标离散化

    涂色:(日文题目,自己翻译成了中文)为了宣传信息竞赛,要在长方形的三合板上喷油漆来制作招牌.三合板上不需要涂色的部分预先贴好了护板.被护板隔开的区域要涂上不同的颜色,比如上图就应该涂上5种颜色. 请编 ...

  4. hdu4605 树状数组+离散化+dfs

    Magic Ball Game Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  5. hdu 3478 Catch(染色 dfs 或 bfs )

    Problem Description A thief is running away! We can consider the city to N–. The tricky thief starts ...

  6. 图论中DFS与BFS的区别、用法、详解…

    DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...

  7. 图论中DFS与BFS的区别、用法、详解?

    DFS与BFS的区别.用法.详解? 写在最前的三点: 1.所谓图的遍历就是按照某种次序访问图的每一顶点一次仅且一次. 2.实现bfs和dfs都需要解决的一个问题就是如何存储图.一般有两种方法:邻接矩阵 ...

  8. 邻接矩阵实现图的存储,DFS,BFS遍历

    图的遍历一般由两者方式:深度优先搜索(DFS),广度优先搜索(BFS),深度优先就是先访问完最深层次的数据元素,而BFS其实就是层次遍历,每一层每一层的遍历. 1.深度优先搜索(DFS) 我一贯习惯有 ...

  9. DFS和BFS模板

    DFS: 该DFS框架以2D坐标范围为例,来体现DFS算法的实现思想 #include<cstdio> #include<cstring> #include<cstdli ...

随机推荐

  1. ios开发ARC,IBOutlets之strong与weak

    今天在写程序的时候,用IBOutlets连了一个自定义的控件,出现了问题,后面访问的时候,控件里有些subviews没有初始化好,取到的时候为nil, 程序里用了ARC, IBOutlets一连接上, ...

  2. linuxtoy.org资源

    https://linuxtoy.org/archives.html Archives 在 Android 系统上安装 Debian Linux 与 R (2015-07-14) Pinos:实现摄像 ...

  3. ES6 中字符串的扩展

    1. 字符的Unicode表示法 JavaScript允许采用 \uxxxx 形式表示一个字符,其中 xxxx 表示字符的 Unicode 码点. "\u0061" // 表示小写 ...

  4. poj2125 最小点权覆盖集

    题意:有一张图,对于每个点,有出边和入边,现在目的是删除改图的所有边,对于每个点,删除出边的花费Wi-,删除入边的花费Wi+,现在的目的求删去所有边后的花费最小. 建图方法:对于每个点i,拆点为i,i ...

  5. js单选按钮的默认值

    function SelectWindow(str) { initradio('PhysiotherapyOptionsTable.Sex',sex);       } function initra ...

  6. 预警| Confluence 高危漏洞被大规模利用,阿里云WAF接入即可防护,支持免费应急服务

    2019年4月4日,阿里云安全应急响应中心监测到Confluence 官方发布安全更新指出,Widget Connector 存在服务端模板注入漏洞,攻击者能利用此漏洞实现目录穿越遍历甚至远程命令执行 ...

  7. 2017 ACM-ICPC 亚洲区(西安赛区)网络赛: B. Coin 【概率题】【数论】

    Bob has a not even coin(就是一个不均匀的硬币,朝上的概率不一定是1/2), every time he tosses the coin, the probability tha ...

  8. KiCad EDA 5.1.2 使用圆形板框时出现无法走线的问题

    KiCad EDA 5.1.2 使用圆形板框时出现无法走线的问题 看到官方已经修复,等着官方发布新的版本 5.1.3. Steps to reproduce: 1) create new board. ...

  9. oralce函数 count(*|[distinct|all]x)

    [功能]统计数据表选中行x列的合计值. [参数] *表示对满足条件的所有行统计,不管其是否重复或有空值(NULL) all表示对所有的值统计,默认为all distinct只对不同的值统计, 如果有参 ...

  10. ros自定义消息

    ros自定义消息可以根据自身项目需求定义和封装想要的数据类型和数据结构.具体可以参考维基百科关于ros自定义消息部分 这里我只是记录自定义消息的要点部分: 1.首先要在工作空间下功能包中创建一个msg ...