1066 引水入城

2010年NOIP全国联赛提高组

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
 
 
题目描述 Description

在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠。该国的行政 区划十分特殊,刚好构成一个N行M列的矩形,如上图所示,其中每个格子都代表一座城 市,每座城市都有一个海拔高度。 为了使居民们都尽可能饮用到清澈的湖水,现在要在某些城市建造水利设施。水利设施 有两种,分别为蓄水厂和输水站。蓄水厂的功能是利用水泵将湖泊中的水抽取到所在城市的 蓄水池中。因此,只有与湖泊毗邻的第1行的城市可以建造蓄水厂。而输水站的功能则是通 过输水管线利用高度落差,将湖水从高处向低处输送。故一座城市能建造输水站的前提,是 存在比它海拔更高且拥有公共边的相邻城市,已经建有水利设施。 由于第N行的城市靠近沙漠,是该国的干旱区,所以要求其中的每座城市都建有水利 设施。那么,这个要求能否满足呢?如果能,请计算最少建造几个蓄水厂;如果不能,求干 旱区中不可能建有水利设施的城市数目。

输入描述 Input Description

输入的每行中两个数之间用一个空格隔开。 输入的第一行是两个正整数N和M,表示矩形的规模。 接下来N行,每行M个正整数,依次代表每座城市的海拔高度。

输出描述 Output Description

输出有两行。如果能满足要求,输出的第一行是整数1,第二行是一个整数,代表最少 建造几个蓄水厂;如果不能满足要求,输出的第一行是整数0,第二行是一个整数,代表有 几座干旱区中的城市不可能建有水利设施。

样例输入 Sample Input

2 5

9 1 5 4 3

8 7 6 1 2

样例输出 Sample Output

1

1

数据范围及提示 Data Size & Hint

【数据范围】 本题共有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 说明

数据范围

  1. /*
  2. 对不不能的情况,bfs一边。
  3. 能的话,对于第一行的每个点,他能扩展到最后一行的点一定是连续的
  4. 所以统计第一行每个点在最后一行扩展到的区间,线段覆盖就好。
  5. */
  6. #include<iostream>
  7. #include<cstdio>
  8. #include<cstring>
  9. #include<queue>
  10. #include<algorithm>
  11.  
  12. #define N 507
  13.  
  14. using namespace std;
  15. int n,m,k,ans,cnt,L,R;
  16. int h[N][N];
  17. int dx[]={,,,-};
  18. int dy[]={,-,,};
  19. bool vis[N][N];
  20. struct node{
  21. int x,y,h;
  22. }p;
  23. struct Ly{
  24. int l,r;
  25. bool operator < (const Ly &x)const{
  26. return l<x.l;
  27. }
  28. }seg[N];
  29.  
  30. inline int read()
  31. {
  32. int x=,f=;char c=getchar();
  33. while(c>''||c<''){if(c=='-')f=-;c=getchar();}
  34. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  35. return x*f;
  36. }
  37.  
  38. void bfs(int x,int y)
  39. {
  40. queue<node>q;
  41. p.x=x;p.y=y;p.h=h[x][y];
  42. q.push(p);vis[x][y]=;
  43. while(!q.empty())
  44. {
  45. int xx,yy;
  46. node tmp=q.front();q.pop();
  47. for(int j=;j<;j++)
  48. {
  49. xx=tmp.x+dx[j];yy=tmp.y+dy[j];
  50. if(xx> && xx<=n && yy> && yy<=m && !vis[xx][yy])
  51. {
  52. p.x=xx,p.y=yy,p.h=h[xx][yy];
  53. if(p.h<tmp.h) vis[xx][yy]=,q.push(p);
  54. }
  55. }
  56. }
  57.  
  58. for(int i=;i<=m;i++)
  59. if(!vis[n][i]) ans++;
  60.  
  61. for(int i=;i<=m;i++)
  62. if(vis[n][i]) L=min(L,i),R=max(R,i);
  63. }
  64.  
  65. int main()
  66. {
  67. //freopen("ly.txt","r",stdin);
  68. n=read();m=read();
  69. for(int i=;i<=n;i++) for(int j=;j<=m;j++)
  70. h[i][j]=read();
  71. if(n<= && n!=)
  72. {
  73. for(int i=;i<=m;i++)
  74. if(!vis[][i]) bfs(,i),ans=;
  75. ans=;bfs(,);
  76. if(ans){printf("0\n%d\n",ans);return ;}
  77. }
  78. for(int i=;i<=m;i++)
  79. {
  80. memset(vis,,sizeof vis);
  81. L=0x3f3f3f3f,R=;bfs(,i);
  82. if(L<=R)seg[++cnt].l=L,seg[cnt].r=R;
  83. }ans=;int last=,i=;
  84. sort(seg+,seg+cnt+);
  85. while (last<=m)
  86. {
  87. int t=;
  88. while (seg[i].l<=last) t=max(seg[i++].r,t);
  89. last=t+; ans++;
  90. }
  91. printf("1\n%d\n",ans);
  92. return ;
  93. }

引水入城 2010年NOIP全国联赛提高组(bfs+贪心)的更多相关文章

  1. Codevs 1066 引水入城 2010年NOIP全国联赛提高组

    1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 在一个遥远的国度 ...

  2. Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组

    1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description S 城现有两座监狱,一共 ...

  3. 1068 乌龟棋 2010年NOIP全国联赛提高组

    1068 乌龟棋 2010年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Descrip ...

  4. 机器翻译 2010年NOIP全国联赛提高组

    题目描述 Description 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义 来替换.对于每个英 ...

  5. 关押罪犯(2010年NOIP全国联赛提高组)

    题目描述 Description S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极 不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用&qu ...

  6. 1126 数字统计 2010年NOIP全国联赛普及组

    1126 数字统计 2010年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver         题目描述 Description 请统计某个 ...

  7. 靶形数独 2009年NOIP全国联赛提高组(搜索)

    靶形数独 2009年NOIP全国联赛提高组  时间限制: 4 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description 小城和小华都是热爱数 ...

  8. 1043 方格取数 2000年NOIP全国联赛提高组

    1043 方格取数 2000年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond         题目描述 Description 设有N* ...

  9. 观光公交 2011年NOIP全国联赛提高组(贪心,递推)

    观光公交 2011年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold       题目描述 Description 风景迷人的小城 Y 市 ...

随机推荐

  1. 从PDF复制到word(换行问题)

    当我们从pdf文档中复制一部分内容到word的时候,pdf的自动换行会自动给文字添加换行,也就是一个回车,让文字另起一行,这样粘贴到word中的时候,word中也会有很多换行符,排版比较麻烦,需要一个 ...

  2. .DS_Store的说明

    今天清理电脑时,突然发现好像有文件的地方都会出现一个.DS_Store文件,今天有时间,索性就查了一下,并做总结发表一篇吧,怕有什么影响,并未真正实施,仅仅供自己收藏,仅供大家参考.      DS_ ...

  3. spark streaming 踩过的那些坑

      系统背景 spark streaming + Kafka高级API receiver 目前资源分配(现在系统比较稳定的资源分配),独立集群 --driver-memory 50G   --exec ...

  4. [TyvjP1050] 最长公共子序列(DP)

    传送门 f[i][j] 表示第 1 个串匹配到第 i 位,第 2 个串匹配到第 j 位的答案. f[i][j] = max(f[i - 1][j], f[i][j - 1])    (a[i] != ...

  5. noip模拟赛 残

    分析:这道题有点丧病啊......斐波那契数列本来增长就快,n <= 10^100又套2层,看到题目就让人绝望.不过这种题目还是有套路的.首先求斐波那契数列肯定要用到矩阵快速幂,外层的f可以通过 ...

  6. hihocoder #1034 : 毁灭者问题 平衡树(set)+线段树

    #1034 : 毁灭者问题 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在 Warcraft III 之冰封王座中,毁灭者是不死族打三本后期时的一个魔法飞行单位. 毁 ...

  7. [bzoj1430]小猴打架_prufer序列

    小猴打架 bzoj-1430 题目大意:题目链接. 注释:略. 想法: 我们发现打架的情况就是一棵树. 我们只需要把确定树的形态然后乘以$(n-1)!$表示生成这棵树时边的顺序. 一共$n$个节点我们 ...

  8. java核心技术卷一

    java核心技术卷一 java基础类型 整型 数据类型 字节数 取值范围 int 4 +_2^4*8-1 short 2 +_2^2*8-1 long 8 +_2^8*8-1 byte 1 -128- ...

  9. 建立DHCPserver

    一.实验的目的:     实现以下的要求的DHCPserver,了解子网内的IP分配的情况. 二.实验目标 虚拟机 vm1:192.168.6.3/24属于子网VMnet8. 在其上建立DHCPser ...

  10. Android怎样监听蓝牙耳机的按键事件

    Android怎样监听蓝牙耳机的按键事件 写在前面: 直接想要代码非常easy,你直接把滚动栏拉到最底端就能够看到.假设想要十分地了解为什么,那就依照我规划的一步一步来理解.下面測试环境以手头上有的「 ...