洛谷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
相关文章推荐
- 洛谷 P1514 [NOIP2010 T4] 引水入城
- |洛谷|NOIP2010|搜索|贪心|P1514 引水入城
- 【NOIP2010提高组T4】引水入城-搜索+DP
- NOIP 提高组 2010 引水入城
- 【dp】NOIP2010提高组引水入城
- NOIP 2010 T4 浅谈如何“引水入城”,泛洪填充法BFS架构FLOODFILL及一类区间覆盖问题贪心求法
- Cpp环境【NOIP2010提高组】【Vijos1777】【Code[VS]1066】【CQYZOJ1793】引水入城
- NOIP 2010 - 提高组 引水入城 棋盘上的BFS+区间覆盖(贪心) 重庆一中高2018级竞赛班第十次测试 2016.9.16 Problem 4
- 【NOIP2010提高组】引水入城
- [NOIP2010] 提高组 洛谷P1541 乌龟棋
- NOIP2010_T4_引水入城 bfs+贪心
- 2010年NOIP全国联赛提高组 T4 引水入城
- NOIP2010 提高组 复赛 flow 引水入城
- [NOIP2010] 提高组 洛谷P1540 机器翻译
- 洛谷 P1199 [NOIP2010普及组 T4] 三国游戏
- [NOIP2010] 提高组 洛谷P1525 关押罪犯
- 记忆化搜索+dp(洛谷1514 引水入城2010noip提高组)
- [NOIP2010] 提高组 洛谷P1514 引水入城
- [Wikioi 1066][NOIP 2010提高组]引水入城
- 【NOIP2010提高组】引水入城