您的位置:首页 > 其它

洛谷P1514 [NOIP2010提高组T4]引水入城

2017-10-13 20:35 260 查看

P1514 引水入城

题目描述

在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠。该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))

inline void swap(int &x, int &y)
{
long long tmp = x;x = y;y = tmp;
}

inline void read(int &x)
{
x = 0;char ch = getchar(), c = ch;
while(ch < '0' || ch > '9')c = ch, ch = getchar();
while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();
if(c == '-')x = -x;
}

const int INF = 0x3f3f3f3f;
const int MAXN = 600 + 10;
const int dx[4] = {1,0,-1,0};
const int dy[4] = {0,1,0,-1};

struct Node
{
int l, r;
Node(int _l, int _r){l = _l;r = _r;}
Node(){l = INF;r = 0;}
}node[MAXN][MAXN];

int n,m,g[MAXN][MAXN],b[MAXN][MAXN],ans;

//可行性判断
void dfs1(int x, int y)
{
b[x][y] = 1;
for(register int i = 0;i < 4;++i)
{
int xx = x + dx[i], yy = y + dy[i];
if(xx <= 0 || yy <= 0 || xx > n || yy > m || b[xx][yy] || g[xx][yy] >= g[x][y])continue;
dfs1(xx, yy);
}
}

void dfs(int x, int y)
{
b[x][y] = 1;
if(x == n)node[x][y].l = min(node[x][y].l, y), node[x][y].r = max(node[x][y].r, y);
for(register int i = 0;i < 4;++ i)
{
int xx = x + dx[i], yy = y + dy[i];
if(xx <= 0 || yy <= 0 || xx > n || yy > m || g[xx][yy] >= g[x][y])continue;
if(b[xx][yy])
{
node[x][y].l = min(node[x][y].l, min(node[xx][yy].l, yy));
node[x][y].r = max(node[x][y].r, max(node[xx][yy].r, yy));
continue;
}
dfs(xx, yy);
node[x][y].l = min(node[x][y].l, min(node[xx][yy].l, yy));
node[x][y].r = max(node[x][y].r, max(node[xx][yy].r, yy));
}
}

int cmp(Node a, Node b)
{
return a.l == b.l ? a.r < b.r : a.l < b.l;
}

int main()
{
read(n), read(m);
for(register int i = 1;i <= n;++ i)
for(register int j = 1;j <= m;++ j)
read(g[i][j]);
for(register int i = 1;i <= m;++ i)
if(!b[1][i])dfs1(1,i);
for(register int i = 1;i <= m;++ i)
if(!b
[i])
++ ans;
if(ans)
{
printf("0\n%d", ans);
return 0;
}
memset(b, 0, sizeof(b));
for(register int i = 1;i <= m;++ i)
if(!b[1][i])
dfs(1, i);
std::sort(node[1] + 1, node[1] + 1 + m, cmp);
int far = 0, now = 0;
for(register int i = 1;i <= m && now < m;++ i)
if(node[1][i].l <= now + 1)far = max(far,node[1][i].r);
else now = far, far = max(far, node[1][i].r), ++ans;
if(now != m)++ ans;
printf("1\n%d", ans);
return 0;
}


洛谷P1514
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: