LUOGU P1514 引水入城 (bfs)
解题思路
拉了很长的战线,换了好几种写法终于过了。。首先每个蓄水场一定是对沙漠造成连续一段的贡献,所以可以$bfs$出每种状态,然后做一次最小区间覆盖,但这样的复杂度有点高。就每次只搜那些比左右高的点。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm> using namespace std;
const int MAXN = ;
const int inf = 0x3f3f3f3f; inline int rd(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {f=ch=='-'?:;ch=getchar();}
while(isdigit(ch)) {x=(x<<)+(x<<)+ch-'';ch=getchar();}
return f?x:-x;
} int xx[]={,,-,},yy[]={-,,,};
int n,m,cnt,h[MAXN][MAXN],ans,num,t;
int vis[MAXN][MAXN];bool b[MAXN];
queue<int> Q[]; struct Data{
int l,r;
friend bool operator<(const Data a,const Data b){
return a.l==b.l?a.r<b.r:a.l<b.l;
}
}data[MAXN]; void bfs(int x,int y){
cnt++;Q[].push(x);Q[].push(y);data[cnt].l=inf;t++;vis[x][y]=t;
while(!Q[].empty()){
int i=Q[].front(),j=Q[].front();Q[].pop();Q[].pop();
if(i==n) {data[t].l=min(data[t].l,j);data[t].r=max(data[t].r,j);b[j]=;}
for(register int k=;k<=;k++){
int ii=xx[k]+i,jj=yy[k]+j;
if(ii< || ii>n || jj< || jj>m || vis[ii][jj]==t) continue;
if(h[i][j]<=h[ii][jj]) continue;vis[ii][jj]=t;
// if(ii==n) {data[t].l=min(data[t].l,jj);data[t].r=max(data[t].r,jj);b[jj]=1;}
Q[].push(ii);Q[].push(jj);
}
}
// if(data[cnt].l==inf) cnt--;
// cout<<data[cnt].l<<" "<<data[cnt].r<<endl;
} int main(){
n=rd();m=rd();
for(register int i=;i<=n;i++)
for(register int j=;j<=m;j++)
h[i][j]=rd();
for(int i=;i<=m;i++)
if(h[][i]>=h[][i-] && h[][i]>=h[][i+]) bfs(,i);
for(int i=;i<=m;i++) if(!b[i]) ans++;
if(ans) {puts("");printf("%d\n",ans);return ;}
sort(data+,data++cnt);int now=;data[cnt+].l=inf;
for(int i=;i<=cnt;i++) {
int mx=,p=i;if(data[p].r<=now) continue;
while(data[p].l-now<=) {mx=max(mx,data[p].r);p++;}
now=mx;num++;i=p-;
}
puts(""),printf("%d",num);
return ;
}
LUOGU P1514 引水入城 (bfs)的更多相关文章
- [luogu]P1514 引水入城[搜索][记忆化][DP]
[luogu]P1514 引水入城 引水入城 题目描述在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形 ,如下图所示,其中每个格 ...
- 【luogu P1514 引水入城】 题解
题目链接:https://www.luogu.org/problemnew/show/P1514 // luogu-judger-enable-o2 #include <iostream> ...
- Luogu P1514 引水入城
我承认我有点懒(洛谷已经发过题解了,但我发誓要坚持写博客) 这道题坑了我3天…… 首先一看就与染色问题类似,果断BFS(写DFS炸了) 先将最上面(靠近水)的一行全部扔进队列里,做一遍BFS 再对最下 ...
- luogu 1066 引水入城(bfs+贪心)
90分,有一个点TLE.... 首先可以证明一个东西,如果从上面一排的某个点bfs一次到最下面一排的饮水点不是一个区间的话,那么最后一定所有饮水点不会被覆盖完的. 证明考虑反证法. 所以从上面一排的每 ...
- Luogu P1514引水入城【搜索】 By cellur925
题目传送门 这道题开始看好像并没有什么思路,和搜索好像也并没有什么关系.但是我们手玩下样例就会发现,思路其实就三句话:(写这道题的时候在代码里写的) //我们想知道从第1行的每列往下到干旱区的范围 / ...
- [NOIp2010] luogu P1514 引水入城
跟 zzy, hwx 等人纠结是否回去上蛋疼的董老板的课. 题目描述 如图所示.你有一个 N×MN\times MN×M 的矩阵,水可以从一格流到与它相邻的格子,需要满足起点的海拔严格高于终点海拔.定 ...
- Luogu 1514 引水入城 (搜索,动态规划)
Luogu 1514 引水入城 (搜索,动态规划) Description 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N行M列的矩形,如上图 ...
- 洛谷P1514 引水入城
洛谷P1514 引水入城 原题链接 一道好题...细节真多 第一次提交90分,然后就GG了,不知从何改起 其实比较简单吧... 首先,一个点的水流向最后一排,一定可以形成一个区间. 不行的话肯定GG ...
- 洛谷 P1514 引水入城 解题报告
P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 NN 行 \times M×M 列的矩形,如上图所示,其中每个格 ...
随机推荐
- 第36讲 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景
在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...
- hadoop 8088 看不到mapreduce 任务的执行状态
进到8088页面后,怎么看不到mapreudce的执行状态,有哪里需要配置的 解决办法: 在$HADOOP_HOME/conf/mapred-site.xml 在原来的配置文件基础之上添加: < ...
- python学习8—函数之高阶函数与内置函数
python学习8—函数之高阶函数与内置函数 1. 高阶函数 a. map()函数 对第二个输入的参数进行第一个输入的参数指定的操作.map()函数的返回值是一个迭代器,只可以迭代一次,迭代过后会被释 ...
- 关于ctype.h头文件使用说明
ctype.h里的函数概况: 1.字符测试函数 (1)函数原型均为 int isXXX( int ch) (2)参数为int,任何参数均被转换为整形 (3)只能处理[0,127]之间的值 2.字符映射 ...
- Servlet接口的抽象方法实现
1.init:初始化方法,在Servlet被创建时执行,只会执行一次2.service:提供服务,每此Servelet被访问时service都会执行3.destroy:销毁方法,在服务器正常关闭时执行 ...
- java 一维数组的输出方式
1.使用传统的for()循环输出: //定义一个数组 int []array = {1,2,3,4,5}; for(int i=0;i<array.length;i++) { System.ou ...
- C++之控制内存分配
一.内存分配方式 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区.栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释 ...
- js隐式类型转换,预编译、递归、作用域,作用域链、闭包、立即执行函数、继承圣杯模式
隐式类型转换 调用Number()当有运算符(加减乘除,求余)时,会调用Number()转为数字再运算,除了 加 当 有字符串时就变身成拼接Boolean();String(); typeof()st ...
- sql中取出字符串中数字
select substring(reverse('0->星光'),PATINDEX('%[0-9]%',reverse('0->星光')),1)
- 新知道一个 端对端加密 Signal protocol
看 socketio Sponsors 列表中的小蓝鸟,发现网站中有使用 x-jquery-tmpl [翻译]WhatsApp 加密概述(技术白皮书) 知道一个叫 Signal 协议 的端对端加密 端 ...