跟 zzy, hwx 等人纠结是否回去上蛋疼的董老板的课。

题目描述



如图所示。你有一个 N×MN\times MN×M 的矩阵,水可以从一格流到与它相邻的格子,需要满足起点的海拔严格高于终点海拔。定义两个格子相邻,当且仅当它们合法存在,且它们的横坐标和纵坐标中有且仅有一个相同,另一个数值之差严格为 111。请你告诉我,至少需要在第一行的多少格上放水,才能使最后一行的所有格子都有水。

Solution

这算是我想到的一个贪心吧。从左往右处理最后一行的每个点,找到选中后水能流到这个点的、第一行的最右边的点,并打通这个点。标记所有被该点浇灌的格子。

证明: 当处理到第 yyy 格的时候,前 y−1y-1y−1 格早已被处理完毕。所以如果在第一行存在两个点,它们都能浇到 yyy,选右边的点显然更有意义,因为它貌似有潜力浇灌更多的点。

时间复杂度 O(N3)O(N^3)O(N3)。

#include<cstdio>
#include<cstdlib>
#include<cstring> const int MAXN=510; int n,m;
int fx[6]={0,0,1,-1};
int fy[6]={1,-1,0,0};
bool vis[MAXN][MAXN];
struct node{
int x,y;
}q[MAXN*MAXN*10];
int st,ed;
int a[MAXN][MAXN];
int tf[MAXN]; void SPFA(int stx,int sty,int type){
st=1;ed=2;
q[st].x=stx;q[st].y=sty;
memset(vis,0,sizeof(vis));vis[stx][sty]=1;
while(st!=ed){
node x=q[st];
for(int i=0;i<4;++i){
int nx=x.x+fx[i],ny=x.y+fy[i];
if(nx<1||nx>n||ny<1||ny>m) continue;
if(vis[nx][ny]||(type?(a[nx][ny]<=a[x.x][x.y]):(a[nx][ny]>=a[x.x][x.y]))) continue;
vis[nx][ny]=1;
q[ed].x=nx;q[ed++].y=ny;
}
++st;
}
}
int work(int ST){
SPFA(n,ST,1);
ST=0;
for(int i=m;i>=1;--i)
if(vis[1][i]){
ST=i;
break;
}
if(!ST) return 0;
SPFA(1,ST,0);
for(int i=1;i<=m;++i)
if(vis[n][i])
tf[i]=1;
return 1;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",&a[i][j]);
memset(tf,0,sizeof(tf));
int cnt=0,ans=0;
for(int i=1;i<=m;++i){
if(tf[i]) continue;
int r=work(i);
if(!r)
++cnt;
else
++ans;
}
if(cnt)
printf("0\n%d",cnt);
else
printf("1\n%d",ans);
}

[NOIp2010] luogu P1514 引水入城的更多相关文章

  1. [luogu]P1514 引水入城[搜索][记忆化][DP]

    [luogu]P1514 引水入城 引水入城 题目描述在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形 ,如下图所示,其中每个格 ...

  2. 【luogu P1514 引水入城】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1514 // luogu-judger-enable-o2 #include <iostream> ...

  3. Luogu P1514 引水入城

    我承认我有点懒(洛谷已经发过题解了,但我发誓要坚持写博客) 这道题坑了我3天…… 首先一看就与染色问题类似,果断BFS(写DFS炸了) 先将最上面(靠近水)的一行全部扔进队列里,做一遍BFS 再对最下 ...

  4. Luogu P1514引水入城【搜索】 By cellur925

    题目传送门 这道题开始看好像并没有什么思路,和搜索好像也并没有什么关系.但是我们手玩下样例就会发现,思路其实就三句话:(写这道题的时候在代码里写的) //我们想知道从第1行的每列往下到干旱区的范围 / ...

  5. LUOGU P1514 引水入城 (bfs)

    传送门 解题思路 拉了很长的战线,换了好几种写法终于过了..首先每个蓄水场一定是对沙漠造成连续一段的贡献,所以可以$bfs$出每种状态,然后做一次最小区间覆盖,但这样的复杂度有点高.就每次只搜那些比左 ...

  6. Luogu 1514 引水入城 (搜索,动态规划)

    Luogu 1514 引水入城 (搜索,动态规划) Description 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N行M列的矩形,如上图 ...

  7. 洛谷P1514 引水入城

    洛谷P1514 引水入城 原题链接 一道好题...细节真多 第一次提交90分,然后就GG了,不知从何改起 其实比较简单吧... 首先,一个点的水流向最后一排,一定可以形成一个区间. 不行的话肯定GG ...

  8. 洛谷 P1514 引水入城 解题报告

    P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 NN 行 \times M×M 列的矩形,如上图所示,其中每个格 ...

  9. CODEVS 1066/洛谷 P1514引水入城

    1066 引水入城 2010年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description 在一个遥远的国 ...

随机推荐

  1. charles 黑名单

    本文参考:charles 黑名单 charles 黑名单 功能:阻止对匹配HOST的请求:可以直接把请求丢掉,也可以直接返回403状态码: 我一般用黑名单工具来block一些软件的自动上传功能 黑名单 ...

  2. Hadoop 之 Hadoop2.0

    1.Hadoop2.0与1.0 答:Hadoop2.0之后的版本移除了原有的JobTracker和TaskTracker,改由Yarn平台的ResourceManager负责集群中所有资源的管理和分配 ...

  3. Android Studio [RecyclerView/列表视图]

    LinearRecyclerViewActivity.java package com.xdw.a122.recyclerview; import android.graphics.Rect; imp ...

  4. MapReduce之Job提交流程源码和切片源码分析

    hadoop2.7.2 MapReduce Job提交源码及切片源码分析 首先从waitForCompletion函数进入 boolean result = job.waitForCompletion ...

  5. Android系统开发实务实训

    实训项目 :               Android系统开发实务实训                           项目成品名称:         绝地坦克                 ...

  6. 【Django】一对多表结构

    1.创建project数据库表 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.co ...

  7. 每个人都要学的图片压缩终极奥义,有效解决 Android 程序 OOM

    # 由来 在我们编写 Android 程序的时候,几乎永远逃避不了图片压缩的难题.除了应用图标之外,我们所要显示的图片基本上只有两个来源: 来自网络下载 本地相册中加载 不管是网上下载下来的也好,还是 ...

  8. 利用echarts展示旅行足迹

    前言 一直有个环游世界的梦,周游列国,体验不同国家的人类文明,寻山访水,体验造物主大自然的伟大造化.毕竟人生不止眼前的苟且,还有诗和远方.这么多年以来,陆续走过了一些地方,每到一个地方,都让我离梦想又 ...

  9. 问题:程序编译通过,但是执行时报错:coredump

    问题描述: 在一个客户现场搭建环境时,遇到了一个棘手的问题,C代码编译通过后,无法正常运行,启动会出现“coredump”错误. 运行环境为新搭建的AIX6.1,数据库为Oracle11.2.0.2. ...

  10. JS/JQuery 文档加载完成

    1. $(function(){...}); 文档树加载完执行的方法:(注意:不包括图片.css.js等文件): 一个页面中可以有多个$(function(){...}); 方法: 两种写法: //第 ...