[POI2007]洪水pow
Description
AKD市处在一个四面环山的谷地里。最近一场大暴雨引发了洪水,AKD市全被水淹没了。Blue Mary,AKD市的市长,召集了他的所有顾问(包括你)参加一个紧急会议。经过细致的商议之后,会议决定,调集若干巨型抽水机,将它们放在某些被水淹的区域,而后抽干洪水。你手头有一张AKD市的地图。这张地图是边长为\(m\times n\)的矩形,被划分为\(m\times n\)个\(1\times 1\)的小正方形。对于每个小正方形,地图上已经标注了它的海拔高度以及它是否是AKD市的一个组成部分。地图上的所有部分都被水淹没了。并且,由于这张地图描绘的地面周围都被高山所环绕,洪水不可能自动向外排出。显然,我们没有必要抽干那些非AKD市的区域。每个巨型抽水机可以被放在任何一个\(1\times 1\)正方形上。这些巨型抽水机将持续地抽水直到这个正方形区域里的水被彻底抽干为止。当然,由连通器原理,所有能向这个格子溢水的格子要么被抽干,要么水位被降低。每个格子能够向相邻的格子溢水,“相邻的”是指(在同一高度水平面上的射影)有公共边。
Input
第一行是两个数m,n(1<=m,n<=1000). 以下m行,每行n个数,其绝对值表示相应格子的海拔高度;若该数为正,表示他是AKD市的一个区域;否则就不是。请大家注意:所有格子的海拔高度其绝对值不超过1000,且可以为零.
Output
只有一行,包含一个整数,表示至少需要放置的巨型抽水机数目。
Sample Input
6 9
-2 -2 -1 -1 -2 -2 -2 -12 -3
-2 1 -1 2 -8 -12 2 -12 -12
-5 3 1 1 -12 4 -6 2 -2
-5 -2 -2 2 -12 -3 4 -3 -1
-5 -6 -2 2 -12 5 6 2 -1
-4 -8 -8 -10 -12 -8 -6 -6 -4
Sample Output
2
HINT

首先我说一下题意:
1、所谓溢水就是你想的那么简单,只能向四周溢水,并且满足物理定理
2、开始的时候洪水要多高有多高
3、HINT里面灰色的是城市,不是说抽水机能抽走哪些格子里的水
抽水机放在城市里一定是最优的,而且抽水机一定要从高度低的地方放起。如果说一个点上放了抽水机,那么它周围点的上面都要放一个抽水机,记得都要放一个抽水机,但是不一定是挨着地面放的。那些被间接放了抽水机的点我们称其为伪抽水机。
然后我们从最低的点开始枚举,如果有伪抽水机的话先对其进行拓展,如果不能拓展了就找到那些没有被抽水的城市开始抽水。
然后记得无论如何都是从最低的点开始拓展,排序的话就开个vector来维护。
/*program from Wolfycz*/
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
int x=0,f=1;char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
return x*f;
}
inline void print(int x){
if (x>=10) print(x/10);
putchar(x%10+'0');
}
const int N=1e3;
const int dx[4]={0,0,1,-1};
const int dy[4]={1,-1,0,0};
struct ID{int x,y;};
vector<ID> h1[N+10],h2[N+10];
int v[N+10][N+10],map[N+10][N+10];
int n,m,Ans,Max;
bool in_map(int x,int y){return x>0&&x<=n&&y>0&&y<=m;}
void bfs(int x,int y){
for (int k=0;k<4;k++){
int tx=x+dx[k],ty=y+dy[k];
if (!in_map(tx,ty)||~v[tx][ty]) continue;
v[tx][ty]=max(v[x][y],map[tx][ty]);
h2[v[tx][ty]].push_back((ID){tx,ty});
}
}
int main(){
n=read(),m=read();
memset(v,255,sizeof(v));
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
int x=read();
Max=max(Max,x);
if (x>0) h1[x].push_back((ID){i,j});
map[i][j]=abs(x);
}
}
for (int i=1;i<=Max;i++){//按高度来拓展
while (true){
if (h2[i].size()){
int x=h2[i].back().x,y=h2[i].back().y;
h2[i].pop_back();
bfs(x,y);
}else if (h1[i].size()){
int x=h1[i].back().x,y=h1[i].back().y;
h1[i].pop_back();
if (~v[x][y]) continue;//因为是从低到高来拓展,所以如果被标记了就一定被抽光了
Ans++;
v[x][y]=map[x][y];
bfs(x,y);
}else break;
}
}
printf("%d\n",Ans);
return 0;
}
[POI2007]洪水pow的更多相关文章
- [POI2007]洪水pow 题解
[POI2007]洪水pow 时间限制: 5 Sec 内存限制: 128 MB 题目描述 AKD市处在一个四面环山的谷地里.最近一场大暴雨引发了洪水,AKD市全被水淹没了.Blue Mary,AKD ...
- bzoj1104: [POI2007]洪水pow
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #i ...
- 【BZOJ】1104: [POI2007]洪水pow
题意 给一个\(n * m(1 \le n, m \le 1000)\)的矩阵,如果\(a_{i, j}\)为正表示城市.\(|a_{i, j}|(|a_{i, j}| \le 1000)\)是格子\ ...
- [POI2007]洪水pow 并查集
我们先得出一个结论:水泵要建在城市上.因为如果在非城市上建能把其他一些城市抽干,那么在城市上建也是一个效果(自己画图感性理解一下) 然后我们明白抽水的条件:周围的高度要>=自身的高度,这样会抽完 ...
- [POI2007]洪水pow bfs
发现:只在所有自己的城市建水泵一定是最优解. 所以对自己的城市按高度排序,该城市不用建的前提是从他出发经过一条高度都小于等于他的路径能到达一个已经修建水泵的 sort+bfs...... #inclu ...
- 并查集 - BZOJ 1104 [POI2007]洪水
BZOJ 1104 [POI2007]洪水 描述 AKD 市处在一个四面环山的谷地里.最近一场大暴雨引发了洪水,AKD 市全被水淹没了.Blue Mary,AKD 市的市长,召集了他的所有顾问(包括你 ...
- 洪水 Pow
Description AKD市处在一个四面环山的谷地里.最近一场大暴雨引发了洪水,AKD市全被水淹没了.Blue Mary,AKD市的市长,召集了他的所有顾问(包括你)参加一个紧急会议.经过细致的商 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [洛谷3457][POI2007]POW-The Flood
洛谷题目链接:[POI2007]POW-The Flood 题意翻译 Description 你手头有一张该市的地图.这张地图是边长为 m∗n 的矩形,被划分为m∗n个1∗1的小正方形.对于每个小正方 ...
随机推荐
- 深入浅出Redis(三)高级特性:管道
Redis是一个响应式的服务,当client发送一个请求后,就处于堵塞状态等待Redis返回结果. 这样一次命令消耗的时间就包含三个部分:请求从client到server的时间.结果从server到c ...
- 淘宝API学习之道:淘宝TOP之API接口接入教程
作为一个中小型站点开发人员,淘宝API的开放大大缩短了站点的开发周期和运作效率.面对海量的数据.开发人员仅仅要细致阅读开发文档,熟悉对应的接口,就能够把数据导入自己的站点,这样就不必望洋兴叹了. 眼下 ...
- Java线程池的简单使用
最近由于公司的业务需求,需要使用线程池来进行对数据进行处理,所以就简单的学习了一下线程池的东西,刚接触感觉挺难的,不过使用了就不感觉那么难了,还是蛮简单的, package com.yd.sms.jo ...
- 提升Android编译速度
Android codebase都非常大.编译一次都须要花非常多时间.假设是preloader/lk/bootimage还好,可是Android的话都是非常久. 实际上这个编译时间还是能够进一步缩短! ...
- Intel为Google的物联网平台Brillo推出开发板Edison
Brillo* is a solution from Google* for building connected devices. Incorporating aspects of the Andr ...
- hadoop生态系统学习之路(十)MR将结果输出到hbase
之前讲了MR将结果输出到hdfs.hive.db,今天再给大家分享一下,怎样将结果输出到hbase. 首先,提一句,笔者在hadoop集群运行此MR的时候报了一个错误.是一个jar包的缘故,这个错误是 ...
- java8--IO工具类(java疯狂讲义3复习笔记)
Paths类 public static void pathTest(){ Path path = Paths.get("~"); System.out.println(path) ...
- c/c++内存使用原则
1 no malloc no free 2 no new no delete 如果对象不是new出来的,那么这个对象在生命周期结束后会自动调用析构函数自己释放自己的内存,不需要delete. 但是如果 ...
- 系统队列中的Windows错误报告
- 生成 hibernate 映射文件和实体类
创建web工程,使用Hibernate的时候,在工程里一个一个创建实体类太麻烦,浪费时间,现在教大家如何用MyEclipse自动生成Hibernate映射文件及实体类 方法/步骤 创建数据库,创建 ...