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 列的矩形,如上图所示,其中每个格 ...
随机推荐
- Codeforces 1167A-Telephone Number
题目链接:http://codeforces.com/problemset/problem/1167/A 思路:检索前面0 ~(n −11)个字符中是否有 8 即可. AC代码: #include&l ...
- Landsat数据下载与介绍
1 数据下载 根据时间选择不同的Landsat卫星传感器 根据经纬度选择对应的条带: Lansdat Analysis Ready Data (ARD) Tile Conversion Tool: 把 ...
- Spark与Hadoop的对比
- Java动态代理与CGLib
Java帝国之动态代理 CGLib:从兄弟到父子-动态代理在民间是怎么玩的? 以上两篇文章引用自微信公众号: 码农翻身 Java动态代理 深度详解 以上文章引用博客园:陈树义
- JS函数进阶
函数的定义方式 函数声明 函数表达式 new Function 函数声明 function foo () { } 函数表达式 var foo = function () { } 函数声明与函数 ...
- 专访阿里云MVP王俊杰:开发者的超能力是用技术让世界更美好
[王俊杰:阿里云MVP,陕西创博网络科技有限公司总经理.大数据与物联网的爱好者与实践者. 8年以上互联网从业经验,曾从事军工相关仿真分析软件研发与集成.4年以上大数据系统开发经验.目前正与天水市秦州区 ...
- thinkphp present标签
present标签用于判断某个变量是否已经定义,用法: 大理石平台精度等级 <present name="name"> name已经赋值 </present> ...
- 线段树+欧拉函数——cf1114F
调了半天,写线段树老是写炸 /* 两个操作 1.区间乘法 2.区间乘积询问欧拉函数 欧拉函数计算公式 phi(mul(ai))=mul(ai) * (p1-1)/p1 * (p2-1)/p2 * .. ...
- JavaScript中的表单编程
表单编程 1获取表单相关信息 1.什么是表单元素 1.什么是表单元素 在H TML中表单就是指form标签,它的作用是将用户输入或选择的数据提交给指定的服务器 2.如何获取表单元素 <form ...
- VS2010-MFC(对话框:颜色对话框)
转自:http://www.jizhuomi.com/software/177.html 颜色对话框大家肯定也不陌生,我们可以打开它选择需要的颜色,简单说,它的作用就是用来选择颜色.MFC中提供了CC ...