引水入城 2010年NOIP全国联赛提高组(bfs+贪心)
1066 引水入城
2010年NOIP全国联赛提高组

在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠。该国的行政 区划十分特殊,刚好构成一个N行M列的矩形,如上图所示,其中每个格子都代表一座城 市,每座城市都有一个海拔高度。 为了使居民们都尽可能饮用到清澈的湖水,现在要在某些城市建造水利设施。水利设施 有两种,分别为蓄水厂和输水站。蓄水厂的功能是利用水泵将湖泊中的水抽取到所在城市的 蓄水池中。因此,只有与湖泊毗邻的第1行的城市可以建造蓄水厂。而输水站的功能则是通 过输水管线利用高度落差,将湖水从高处向低处输送。故一座城市能建造输水站的前提,是 存在比它海拔更高且拥有公共边的相邻城市,已经建有水利设施。 由于第N行的城市靠近沙漠,是该国的干旱区,所以要求其中的每座城市都建有水利 设施。那么,这个要求能否满足呢?如果能,请计算最少建造几个蓄水厂;如果不能,求干 旱区中不可能建有水利设施的城市数目。
输入的每行中两个数之间用一个空格隔开。 输入的第一行是两个正整数N和M,表示矩形的规模。 接下来N行,每行M个正整数,依次代表每座城市的海拔高度。
输出有两行。如果能满足要求,输出的第一行是整数1,第二行是一个整数,代表最少 建造几个蓄水厂;如果不能满足要求,输出的第一行是整数0,第二行是一个整数,代表有 几座干旱区中的城市不可能建有水利设施。
2 5
9 1 5 4 3
8 7 6 1 2
1
1
【数据范围】 本题共有10个测试数据,每个数据的范围如下表所示: 测试数据编号 能否满足要求 N M 1 不能 ≤ 10 ≤ 10 2 不能 ≤ 100 ≤ 100 3 不能 ≤ 500 ≤ 500 4 能 = 1 ≤ 10 5 能 ≤ 10 ≤ 10 6 能 ≤ 100 ≤ 20 7 能 ≤ 100 ≤ 50 8 能 ≤ 100 ≤ 100 9 能 ≤ 200 ≤ 200 10 能 ≤ 500 ≤ 500 对于所有的10个数据,每座城市的海拔高度都不超过10^6
样例2 说明

数据范围

/*
对不不能的情况,bfs一边。
能的话,对于第一行的每个点,他能扩展到最后一行的点一定是连续的
所以统计第一行每个点在最后一行扩展到的区间,线段覆盖就好。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm> #define N 507 using namespace std;
int n,m,k,ans,cnt,L,R;
int h[N][N];
int dx[]={,,,-};
int dy[]={,-,,};
bool vis[N][N];
struct node{
int x,y,h;
}p;
struct Ly{
int l,r;
bool operator < (const Ly &x)const{
return l<x.l;
}
}seg[N]; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} void bfs(int x,int y)
{
queue<node>q;
p.x=x;p.y=y;p.h=h[x][y];
q.push(p);vis[x][y]=;
while(!q.empty())
{
int xx,yy;
node tmp=q.front();q.pop();
for(int j=;j<;j++)
{
xx=tmp.x+dx[j];yy=tmp.y+dy[j];
if(xx> && xx<=n && yy> && yy<=m && !vis[xx][yy])
{
p.x=xx,p.y=yy,p.h=h[xx][yy];
if(p.h<tmp.h) vis[xx][yy]=,q.push(p);
}
}
} for(int i=;i<=m;i++)
if(!vis[n][i]) ans++; for(int i=;i<=m;i++)
if(vis[n][i]) L=min(L,i),R=max(R,i);
} int main()
{
//freopen("ly.txt","r",stdin);
n=read();m=read();
for(int i=;i<=n;i++) for(int j=;j<=m;j++)
h[i][j]=read();
if(n<= && n!=)
{
for(int i=;i<=m;i++)
if(!vis[][i]) bfs(,i),ans=;
ans=;bfs(,);
if(ans){printf("0\n%d\n",ans);return ;}
}
for(int i=;i<=m;i++)
{
memset(vis,,sizeof vis);
L=0x3f3f3f3f,R=;bfs(,i);
if(L<=R)seg[++cnt].l=L,seg[cnt].r=R;
}ans=;int last=,i=;
sort(seg+,seg+cnt+);
while (last<=m)
{
int t=;
while (seg[i].l<=last) t=max(seg[i++].r,t);
last=t+; ans++;
}
printf("1\n%d\n",ans);
return ;
}
引水入城 2010年NOIP全国联赛提高组(bfs+贪心)的更多相关文章
- Codevs 1066 引水入城  2010年NOIP全国联赛提高组
		1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 在一个遥远的国度 ... 
- Codevs 1069 关押罪犯  2010年NOIP全国联赛提高组
		1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description S 城现有两座监狱,一共 ... 
- 1068 乌龟棋  2010年NOIP全国联赛提高组
		1068 乌龟棋 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Descrip ... 
- 机器翻译  2010年NOIP全国联赛提高组
		题目描述 Description 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义 来替换.对于每个英 ... 
- 关押罪犯(2010年NOIP全国联赛提高组)
		题目描述 Description S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极 不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用&qu ... 
- 1126 数字统计  2010年NOIP全国联赛普及组
		1126 数字统计 2010年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 请统计某个 ... 
- 靶形数独  2009年NOIP全国联赛提高组(搜索)
		靶形数独 2009年NOIP全国联赛提高组 时间限制: 4 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小城和小华都是热爱数 ... 
- 1043 方格取数  2000年NOIP全国联赛提高组
		1043 方格取数 2000年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 设有N* ... 
- 观光公交  2011年NOIP全国联赛提高组(贪心,递推)
		观光公交 2011年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 风景迷人的小城 Y 市 ... 
随机推荐
- Python条件判断(if)
			Python条件判断(if) 一.基本介绍 1.Python 编程中 if 语句用于控制程序的执行,基本形式为: if 判断条件: 执行语句…… 需要注意的是,Python没有像其他大多数语言一样使用 ... 
- jQuery入门--- 非常好
			jQuery入门------https://blog.csdn.net/dkh_321/article/details/78093788 
- MYSQL Sorting result 把队列堆满了,该怎么办?
			show processlist;发现有200多个队列,select cardnum from table where xxxid = 31 order by abc_time desc 这样的一个排 ... 
- 【bzoj2527】[Poi2011]Meteors(树状数组(单点查询,区间修改)+整体二分)
			[bzoj2527][Poi2011]Meteors Description Byteotian Interstellar Union (BIU) has recently discovered a ... 
- bzoj1007 [HNOI2008]水平可见直线 - 几何 - hzwer.com
			Description Input 第一行为N(0 < N < 50000),接下来的N行输入Ai,Bi Output 从小到大输出可见直线的编号,两两中间用空格隔开,最后一个数字后面也必 ... 
- BZOJ2272: [Usaco2011 Feb]Cowlphabet 奶牛文字
			n<=250个大写字母和m<=250个小写字母,给p<=200个合法相邻字母,求用这些合法相邻字母的规则和n+m个字母能合成多少合法串,答案mod 97654321. 什么鬼膜数.. ... 
- js Date()日期函数浏览器兼容问题解决方法
			一般 直接new Date() 是不会出现兼容性问题的,而 new Date(datetimeformatstring) 常常会出现浏览器兼容性问题,为什么,datetimeformatstring中 ... 
- Ubuntu 16.04 GNOME无法使用拼音输入法问题
			说明:添加好之后重启!不然会出现输入错乱的问题. 参考: http://forum.ubuntu.org.cn/viewtopic.php?t=477765 
- springMVC多数据源使用 跨库跨连接
			原文:http://blog.itpub.net/9399028/viewspace-2106641/ http://blog.csdn.net/a973893384/article/details/ ... 
- Windows Server 2012关机的几种方法
			综合使用方法如下: 1.shutdown -r –f 強制重新启动 2.shutdown –s –f 強制关闭 方法/步骤 1 首先把鼠标移到任务栏右下角,时间往右一点小空位,稍微停留一 ... 
