AOJ 0531 坐标离散化
涂色:(日文题目,自己翻译成了中文)为了宣传信息竞赛,要在长方形的三合板上喷油漆来制作招牌。三合板上不需要涂色的部分预先贴好了护板。被护板隔开的区域要涂上不同的颜色,比如上图就应该涂上5种颜色。
请编写一个程序计算涂色数量,输入数据中,保证看板不会被护板全部遮住,并且护板的边一定是水平或垂直的。
输入:
第一个数是宽w(1 ≤ w ≤ 1000000),第二个数是高h(1 ≤ h ≤ 1000000)。
第二行是护板的数量n(1 ≤ n ≤ 1000),接着n行是每个护板的左下角坐标 (x1 , y1 )和右上角坐标 (x2 , y2 ),用空格隔开: x1 , y1 , x2 , y2 (0 ≤ x1< x2 ≤ w, 0 ≤ y1 < y2 ≤ h 都是整数)
招牌的坐标系如下,左下角是 (0, 0) ,右上角是(w, h) , 测试集中的30%都满足w ≤ 100, h ≤ 100, n ≤ 100。

输出:
一个整数,代表涂色数量。
使用坐标离散化求解。
坐标离散化的思想是:当坐标范围很大而坐标数量很少时,可以考虑把所有用到的横坐标排序,然后用每个坐标对应的下标来更新坐标位置。
举例来说:
这个例子中的用到的横坐标有1,2,4,5,6,7,9,10,11,12,13,14。
那么横坐标对(1,5)就可以转化为(0,3)。节省了一位空间,这个节省在空隙变大后会越来越明显。
通过坐标离散化,通常时间复杂度就可以降到令人满意的程度了。
这里使用了imos法,进一步优化时间复杂度。
接下来是代码,来自http://www.hankcs.com/program/algorithm/aoj-0531-paint-color.html
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include <cstring>
#define MAX_N 1000 + 16 using namespace std; int N, H, W;
int X1[MAX_N], X2[MAX_N], Y1[MAX_N], Y2[MAX_N];
int fld[ * MAX_N][ * MAX_N], // 填充遍历用,代表坐标(i, j)处是否空白(压缩后)
dx[] = { , -, , }, dy[] = { , , , - }; // 压缩坐标,将坐标的值变成“这是第几种值”,返回一共有几种坐标
int compress(int *x1, int *x2, int w)
{
vector<int>xs; for (int i = ; i < N; ++i)
{
int tx1 = x1[i], tx2 = x2[i];
if ( <= tx1 && tx1 < w) xs.push_back(tx1);
if ( <= tx2 && tx2 < w) xs.push_back(tx2);
}
xs.push_back();
xs.push_back(w);
sort(xs.begin(), xs.end());
xs.erase(unique(xs.begin(), xs.end()), xs.end());
for (int i = ; i < N; ++i)
{
x1[i] = find(xs.begin(), xs.end(), x1[i]) - xs.begin();
x2[i] = find(xs.begin(), xs.end(), x2[i]) - xs.begin();
}
return xs.size() - ;
} int bfs()
{
int ans = ;
for (int i = ; i < H; ++i)
{
for (int j = ; j < W; ++j)
{
if (fld[i][j]) continue;
++ans;
queue<pair<int, int> >que;
que.push(make_pair(j, i));
while (!que.empty())
{
int nx = que.front().first, ny = que.front().second;
que.pop(); for (int i = ; i < ; ++i)
{
int tx = nx + dx[i], ty = ny + dy[i];
if (tx < || W < tx || ty < || H< ty || fld[ty][tx] > ) continue;
que.push(make_pair(tx, ty));
fld[ty][tx] = ;
}
}
}
}
return ans;
} ///////////////////////////SubMain//////////////////////////////////
int main(int argc, char *argv[])
{
while (cin >> W >> H, W | H)
{
cin >> N;
for (int i = ; i < N; ++i)
{
cin >> X1[i] >> Y1[i] >> X2[i] >> Y2[i];
} memset(fld, , sizeof(fld)); W = compress(X1, X2, W);
H = compress(Y1, Y2, H); // imos-法
for (int i = ; i < N; i++)
{
fld[Y1[i]][X1[i]]++;
fld[Y1[i]][X2[i]]--;
fld[Y2[i]][X1[i]]--;
fld[Y2[i]][X2[i]]++;
}
// 横向累积
for (int i = ; i < H; i++)
{
for (int j = ; j < W; j++)
{
fld[i][j] += fld[i][j - ];
}
}
// 纵向累积
for (int i = ; i < H; i++)
{
for (int j = ; j < W; j++)
{
fld[i][j] += fld[i - ][j];
}
}// 累积完后,fld中非0部分表示有挡板
cout << bfs() << endl;
}
return ;
}
///////////////////////////End Sub//////////////////////////////////
AOJ 0531 坐标离散化的更多相关文章
- Aizu 0531 "Paint Color" (坐标离散化+DFS or BFS)
传送门 题目描述: 为了宣传信息竞赛,要在长方形的三合板上喷油漆来制作招牌. 三合板上不需要涂色的部分预先贴好了护板. 被护板隔开的区域要涂上不同的颜色,比如上图就应该涂上5种颜色. 请编写一个程序计 ...
- Greedy:Paint Color(AOJ 0531)
涂颜料 题目大意:在一个1000000*1000000的矩阵中放入几块木板,问你这些木板把矩阵划分成了几个区域?输入会给左下角和右上角的坐标,输入W==0且H==0结束. 这一题是书上的作业题,书上有 ...
- AOJ 0531:Paint Color(二维离散+imos)
[题目链接] http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0531 [题目大意] 给出一张图,和一些矩形障碍物,求该图没被障碍物覆 ...
- nyoj_600:花儿朵朵(树状数组+坐标离散化)
http://acm.nyist.net/JudgeOnline/problem.php?pid=600 只附代码好了 #include<bits/stdc++.h> using name ...
- 【坐标离散化】AOJ0531- Paint Color
日文题……一开始被题目骗了以为真的要写文件? 题目大意&&解答戳:❀ #include<iostream> #include<cstdio> #include& ...
- hihoCoder#1079(线段树+坐标离散化)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho所在的学 ...
- Atlantis(坐标离散化)
http://poj.org/problem?id=1151 题意:给出矩形的左上角坐标和右下角坐标(坐标的y轴是向下的),求出矩形面积的并.. 今天好困啊..迷迷糊糊的听会神给讲了讲,敲完之后调试了 ...
- nyoj 600:花儿朵朵(树状数组+坐标离散化)
http://acm.nyist.net/JudgeOnline/problem.php?pid=600 只附代码好了 #include<bits/stdc++.h> using name ...
- HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
随机推荐
- CSS Hack兼容
CSS中有很多标签在不同浏览器中有不同的兼容性问题,问了让网页的功能更好的不同浏览器中显示正常, 需要通过hack的方式来解决浏览器兼容问题. CSS hack问题由来已久,目前我的了解甚少,以下是转 ...
- javascript: Convert special characters to HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 菜鸟学习Spring——SpringIoC容器基于三种配置的对比
一.概述 对于实现Bean信息定义的目标,它提供了基于XML.基于注解及基于java类这三种选项.下面总结一下三种配置方式的差异. 二.Bean不同配置方式比较. 三.Bean不同配置方式的适用场合. ...
- linux配置IP
1.配置ip的几种方式: 1.使用ifconfig命令(临时配置,重启后失效) 2.使用setup工具(RedHat专有的,不过经本人测试,虚拟机装了centos,也有setup,也可以进行配置, ...
- 【Spring实战】—— 16 基于JDBC持久化的事务管理
前面讲解了基于JDBC驱动的Spring的持久化管理,本篇开始则着重介绍下与事务相关的操作. 通过本文你可以了解到: 1 Spring 事务管理的机制 2 基于JDBC持久化的事务管理 Spring的 ...
- 使用pm2自动化部署node项目
1.pm2简介 pm2(process manager)是一个进程管理工具,维护一个进程列表,可以用它来管理你的node进程,负责所有正在运行的进程,并查看node进程的状态,也支持性能监控,负载均衡 ...
- NodeJs安装less(npm方式)
上一次讲了如何在浏览器端解析less文件,这次是在cmd中使用npm中的less模块来解析 详解如下 首下我们去下载一个https://nodejs.org/en/, 一路next之后,因为文件不 ...
- 如何将iso文件安装到VirtualBox里的ubuntu去
我在Window的virtualbox里安装了一个ubuntu: 默认情况下IDE Secondary Master是空的. 方法1:Devices->Insert Guest Addition ...
- 传统数据仓库项目的优化手段 (针对 Oracle+DataStage )
普通手段 分区,HASH-JOIN,数据仓库函数,物化视图,位图索引等等为大伙在数据仓库常用的技术, 而下面列举的tips为项目中常用的优化手段/技巧,绿色背景highlight的部分属于非常规手段, ...
- js、Jquery处理自动计算的输入框事件
js在处理的时候可以使用oninput去获取当前输入框输入的值, jquery的时候使用了keypress和keydown但是发现都不能在输入后触发事件去获取输入框的值,这时候需要使用 ‘input ...