NOIP2010 引水入城
描述
在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠。该国的行政区划十分特殊,刚好构成一个N行M列的矩形,其中每个格子都代表一座城市,每座城市都有一个海拔高度。
为了使居民们都尽可能饮用到清澈的湖水,现在要在某些城市建造水利设施。水利设施有两种,分别为蓄水厂和输水站。蓄水厂的功能是利用水泵将湖泊中的水抽取到所在城市的蓄水池中。因此,只有与湖泊毗邻的第1行的城市可以建造蓄水厂。而输水站的功能则是通过输水管线利用高度落差,将湖水从高处向低处输送。故一座城市能建造输水站的前提,是存在比它海拔更高且拥有公共边的相邻城市,已经建有水利设施。
由于第N行的城市靠近沙漠,是该国的干旱区,所以要求其中的每座城市都建有水利设施。那么,这个要求能否满足呢?如果能,请计算最少建造几个蓄水厂;如果不能,求干旱区中不可能建有水利设施的城市数目。
格式
输入格式
输入文件的每行中两个数之间用一个空格隔开。
输入的第一行是两个正整数N和M,表示矩形的规模。
接下来N行,每行M个正整数,依次代表每座城市的海拔高度。
输出格式
输出有两行。如果能满足要求,输出的第一行是整数1,第二行是一个整数,代表最少建造几个蓄水厂;如果不能满足要求,输出的第一行是整数0,第二行是一个整数,代表有几座干旱区中的城市不可能建有水利设施。
限制
每个测试点1s
提示
本题共有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。
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 struct Edge 7 { 8 int L,R; 9 }B[502]; 10 int n,m,ans; 11 int F[502]; 12 int map[502][502]; 13 int vis[502][502]={0}; 14 int Dx[4]={-1,0,1,0}; 15 int Dy[4]={0,1,0,-1}; 16 17 void dfs(int x,int y,int p) 18 { 19 vis[x][y]=p; 20 if(x==n) 21 { 22 B[p].L=min(B[p].L,y); 23 B[p].R=max(B[p].R,y); 24 } 25 for(int i=0;i<4;i++) 26 if(map[x][y]>map[x+Dx[i]][y+Dy[i]]&&vis[x+Dx[i]][y+Dy[i]]!=p) 27 dfs(x+Dx[i],y+Dy[i],p); 28 } 29 30 bool cmp(Edge a,Edge b) 31 { 32 return a.L<b.L; 33 } 34 35 int main() 36 { 37 memset(map,0x3f3f3f3f,sizeof(map)); 38 memset(F,0x3f3f3f3f,sizeof(F)); 39 cin>>n>>m; 40 ans=m; 41 for(int i=1;i<=n;i++) 42 for(int j=1;j<=m;j++) 43 cin>>map[i][j]; 44 for(int i=1;i<=m;i++) 45 { 46 B[i].L=0x3f3f3f3f; 47 B[i].R=0; 48 if((i==1)||(i==m)||(map[1][i]>=map[1][i-1])||(map[1][i]>=map[1][i+1])) 49 dfs(1,i,i); 50 } 51 for(int i=1;i<=m;i++) 52 if(vis[n][i]>0) ans--; 53 if(ans>0) 54 { 55 cout<<0<<endl<<ans<<endl; 56 return 0; 57 } 58 sort(B+1,B+m+1,cmp); 59 int L = 1; 60 while (L <= m) { 61 ans++; 62 int R = L; 63 for (int k=1; k <= m; k++) { 64 if (B[k].L > L) break; 65 R = max(R,B[k].R); 66 } 67 L = R + 1; 68 } 69 cout<<1<<endl<<ans<<endl; 70 return 0; 71 }