传送门

题目描述:
为了宣传信息竞赛,要在长方形的三合板上喷油漆来制作招牌。
三合板上不需要涂色的部分预先贴好了护板。
被护板隔开的区域要涂上不同的颜色,比如上图就应该涂上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. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化 学习目标 对Direct 3D编程在 ...

  2. python 源文件编码

  3. 序列化方案选型对比 - JSON/ProtocolBuffer/FlatBuffer/DIMBIN

    4千字长文预警!! 背景 JSON/XML不好吗? 好,再没有一种序列化方案能像JSON和XML一样流行,自由.方便,拥有强大的表达力和跨平台能力.是通用数据传输格式的默认首选.不过随着数据量的增加和 ...

  4. shell学习(16)- 压缩和解压缩命令tar和zip

    tar命令 [root@Linux ~]# tar [-cxtzjvfpPN] 文件与目录 .... 参数: -c :建立一个压缩文件的参数指令(create 的意思): -x :解开一个压缩文件的参 ...

  5. 【NS2】常用资源(转载)

    (一). NS常用基本网站 1. 寻求问题答案最好的地方.    http://mailman.isi.edu/pipermail/ns-users/ 2. 柯老师的网站,包含很多非常实用资源:安装, ...

  6. poj 2184 Cow Exhibition(01背包)

    Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10882   Accepted: 4309 D ...

  7. UVa 10520【递推 搜索】

    UVa 10520 哇!简直恶心的递推,生推了半天..感觉题不难,但是恶心,不推出来又难受..一不小心还A了[]~( ̄▽ ̄)~*,AC的猝不及防... 先递推求出f[i][1](1<=i< ...

  8. nodeJs学习-01 http模块

    http模块基础: const http = require("http"); //引入http系统模块 var server = http.createServer(functi ...

  9. C#判断文件是否被混淆

    可以使用混淆工具对一个DLL 和 exe 进行混淆. 但是如何知道一个文件是否已经混淆了. 在发布之前,需要知道是不是有文件忘了混淆. 要判断文件是否混淆,必须知道常用的混淆手法. 混淆就是因为编写的 ...

  10. tp3 key json 分页

    //json 强制转换为array $arr[$key]['checkpro'] = json_decode($val['checkpro'],JSON_FORCE_ARRAY);    $arr[$ ...