引水入城

最近在搞提高组的题,这是某天早上给的T1

T1最难还行

原题目

1605450-20190710193547979-427459130.png

最近考试考多了就是见题打暴力,打搜索,

然而这题真是搜索,

但是并不能只搜索,会T,没亲测,但一定有效

这并不是考试题,所以看看标签(理直气壮的理由)

1605450-20190710193558254-923896690.png

是BFS啊...

那就用DFS吧

这里的DP一开始看没有什么感觉,但是做着做着发现就是不应该有感觉,这是搜索+贪心啊

下面开始正式题解

首先明白一点,同一个水源可以有不同的目的地,而不同的目的地也可以有着不同的水源,由于这题要求看最少源头或是未通水的目的地数目,所以要对每个水源进行深搜,对能够通水的最后一行的格子进行标记

在来证明一个东西:

不存在源头\(a\)\(b\)左边,但是\(a\)到达的区间在\(b\)所到达的右边,

就像这个图(无视那个\(S_1\)):

1605450-20190710193605257-808692750.png

这个图很明显存在交叉,然而如果两个水源能够到达同一格,那么这个格所能够到达的所有下面的点这两个源头一定都能达到,并不存在交叉非公共部分

那么是否所有的搜索方式都不用网上搜呢?

你考虑这样一种路径就好了(灵魂手绘):

1605450-20190710193613478-569173170.png

注意在进行vis数组标记时,所记录的到过的点只对本次搜索生效,也就是说,本次搜索搜到过的点待会可能别的点也要搜,并且搜到的区间也许更大,这对结构有着更大贡献,,如果因搜到过而停止搜索,会导致代码输出大部分大于答案,所以每次搜索到最后一层是需要用该点的表示列的坐标(由于横纵坐标与本题x,y在本题搞得有点昏,暂且这样称呼,有兴趣自己推吧)对该水源的左右区间端点进行更新

然后处理出每个水源能够到的最左端与最右端,

首先跑一遍最后一列,看有没有最后一行没有到达的格子如果有就是无解,在遍历时统计数量输出即可,

如果全部到达,则用sort函数(按左端点)排一下,并且每次去最长的线段,就是右端点最靠后的线段,当然前提是满足左端点小于上一条线段的右端点(对于第一条线段,其左边的限制是1)

每次将下一条线段的左端点限制更新为r+1,意义自证,

对于每个水源的区间更新,给出以下公式:

\(l_i=min(l_i,y)\)

\(r_i=max(r_i,y)\)

就是对于每个水源\(i\),用每个到达的最后一行的格子列坐标进行更新,当然要的是最左边的\(l\)和最右边的\(r\),分别用\(min\)函数和\(max\)函数取区间

当然,初始化时要把\(l\)赋值成\(inf\)(无穷大),把\(r\)赋值成\(-inf\),来保证区间更新操作的稳定

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define R register
const int inf=0x3f3f3f3f;
int n,m;
int pos[505][505];
struct node{int l,r;node(){l=inf;r=-inf;}
}nd[505];
int mx[6]={0,-1,0,1,0};
int my[6]={0,0,1,0,-1};
bool vis[505][505],final[505];
inline void search(const int &x,const int &y,const int &p){vis[x][y]=1;if(x==n){final[y]=1;nd[p].l=min(nd[p].l,y);nd[p].r=max(nd[p].r,y);}for(R int i=1;i<=4;i++){int nx=x+mx[i];int ny=y+my[i];if(1<=nx&&nx<=n&&1<=ny&&ny<=m&&(!vis[nx][ny])&&(pos[x][y]>pos[nx][ny]))search(nx,ny,p);}
}
inline bool cmp(const node &a,const node &b){if(a.l!=b.l) return a.l<b.l;return a.r<b.r;
}
int main(){scanf("%d%d",&n,&m);for(R int i=1;i<=n;i++)for(R int j=1;j<=m;j++)scanf("%d",&pos[i][j]);for(R int i=1;i<=m;i++)if(pos[1][i-1]<=pos[1][i]&&pos[1][i]>=pos[1][i+1]){memset(vis,0,sizeof vis);search(1,i,i);}int tot=0;for(R int i=1;i<=m;i++)if(!final[i]) tot++;if(tot){printf("0\n%d",tot);return 0;}int num=0;for(R int i=1;i<=m;i++)if(nd[i].l!=inf&&nd[i].r!=-inf){nd[++num].l=nd[i].l;nd[num].r=nd[i].r;}sort(nd+1,nd+1+num,cmp);for(R int l=1,r=0,j=1;l<=m;l=r+1,r=0,tot++){while(nd[j].l<=l){r=max(r,nd[j].r);j++;}}printf("1\n%d",tot);return 0;
}

转载于:https://www.cnblogs.com/648-233/p/11166026.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员必知8大排序3大查找(一)

每天都在叫嚣自己会什么技术&#xff0c;什么框架&#xff0c;可否意识到你每天都在被这些新名词、新技术所迷惑&#xff0c;.NET、XML等等技术固然诱人&#xff0c;可是如果自己的基础不扎实&#xff0c;就像是在云里雾里行走一样&#xff0c;只能看到眼前&#xff0c;不能看到…

最详细的U-BOOT源码分析及移植

本文从以下几个方面粗浅地分析u-boot并移植到FS2410板上&#xff1a; 1、u-boot工程的总体结构 2、u-boot的流程、主要的数据结构、内存分配。 3、u-boot的重要细节&#xff0c;主要分析流程中各函数的功能。 4、基于FS2410板子的u-boot移植。实现了NOR Flash和NAND Flash启动,…

常见的算法思想(分治、动态规划、贪心算法、回溯法等)

《数据结构与算法》一书中讲到的几种常见的算法思想包括&#xff1a;递归和分治、动态规划、贪心算法、回溯法、分支限界法、概率算法、线性规划、NP完全性理论。我们平常所见的一般都是前5种&#xff0c;这里简单介绍。 分治法 把一个大规模问题划分成几个子问题&#xff0c;…

织梦教程

/************************************************************************************************************************************************** 织梦 文件说明 很详细 http://bbs.admin5.com/thread-1952932-1-1.html /****************************************…

TinyXML:一个优秀的C++ XML解析器

2019独角兽企业重金招聘Python工程师标准>>> 读取和设置xml配置文件是最常用的操作&#xff0c;试用了几个C的XML解析器&#xff0c;个人感觉TinyXML是使用起来最舒服的&#xff0c;因为它的API接口和Java的十分类似&#xff0c;面向对象性很好。 TinyXML是一个开源…

《C++标准程序库》学习笔记5 — 第七章

1.(P252) 迭代器的分类及其能力&#xff1a;input迭代器只能读取元素一次。如果复制input迭代器&#xff0c;并使原迭代器和新产生副本都向前读取&#xff0c;可能会遍历到不同的值。output迭代器类似。 2.(P258) C不允许修改任何基本类型&#xff08;包括指针&#xff09;的暂…

Android无线调试——抛开USB数据线

开发Android的朋友都知道&#xff0c;真机调试需要把手机与PC相连&#xff0c;然后把应用部署到真机上进行安装和调试。长长的USB线显得很麻烦&#xff0c;而且如果需要USB接口与其他设备连接的话显得很不方便。今天介绍一种不通过USB线就可以进行真机调试的方法。首先让手机与…

C中不能直接比较两个double类型

在比较float 和double类型的时候&#xff0c;因为float/double精度的问题&#xff0c;比如1.000000001可能和1.0000000000001相等&#xff0c;不应该直接使用a>b等类似的方式进行比较&#xff0c;而是采用 两个数做差取绝对值然后跟指定的精度进行比较 &#xff0c;便可得出…

C#基础——C#入门

教材是C#入门经典&#xff08;第四版&#xff09;。 PC:Thinkpad sl410 OS:Win7 Ultimate SDE:VS 2010 Ultimate 1.2 什么是C#&#xff1f; C#是从C、C语言演化而来&#xff0c;Microsoft专门为使用.Net平台而创建的语言&#xff0c;读作C sharp。运行在.Net CRL环境上的应用程…

VS2017动态链接库(.dll)的生成与使用

这里以VS2017为例子&#xff0c;讲解一下动态链接库&#xff08;.dll&#xff09;的生成与使用。 一、动态链接库&#xff08;.dll&#xff09;的生成 1、打开&#xff1a;“文件”-“新建”-“项目” 2、打开&#xff1a;“已安装”-“模板”-“Visual C”-“Win32”-“Win3…

让Windows7 x64 IIS7支持32位应用程序

我的os是Win7 64位&#xff0c;因为开发的一个应用程序使用了非dot net 的32 位的dll。 经常出现无法装载****.dll的问题。 下面的命令让IIS 7支持32位的应用程序&#xff1a; cscript %SystemDrive%\inetpub\AdminScripts\adsutil.vbs set w3svc/AppPools/Enable32bitAppOnWin…

c#中用声音提示报警(转)

using System; using System.Runtime.InteropServices; 调用 Interaction.Beep(); 使用MessageBeep(unit uType):需添加 using System.Runtime.InteropServices; public const int MB_ICONEXCLAMATION 48; [DllImport("user32.dll")] public static extern bool M…

android3.2以上切屏禁止onCreate()

一般切屏禁止onCreate&#xff08;&#xff09;方法需要将activity加上属性&#xff1a; android:configChanges”orientation|keyboardHidden” 但是在3.2以上就不起作用了&#xff0c;需要加上screenSize&#xff08;也只有3.2以上才有这个选项&#xff09;: android:configC…

typedef用法总结

1、用途一&#xff1a;定义一种类型的别名&#xff0c;可以用作同时声明指针型的多个对象。 比如对于char* pa, pb&#xff0c;初学者往往错误地认为定义了两个字符型指针&#xff0c;但是它只声明了一个指向字符变量的指针和一个字符变量&#xff1b; 而 typedef char* PCH…

Linux下gcc编译生成动态链接库*.so文件并调用它

动态库*.so在linux下用c和c编程时经常会碰到&#xff0c;最近在网站找了几篇文章介绍动态库的编译和链接&#xff0c;总算搞懂了这个之前一直不太了解得东东&#xff0c;这里做个笔记&#xff0c;也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。1、动态库的编译下面通过…

Mysql安装后在服务里找不到和服务启动不起来的解决方法

一&#xff0c;在安装完Mysql数据库后&#xff0c;发现在控制面板->管理->服务中找不到Mysql的服务启动 解决方法如下&#xff1a;开启命令行&#xff0c;按照如下步骤即可&#xff1b; 1.进入到mysql的安装包&#xff0c;在bin里执行&#xff1a;mysqld.exe -install …

WINFORM如何只弹出一个子窗体

public partial class Form1:Form{ Form2 fnull; public Form1() { InitializeComponent(); } private void Form1_Click(object sender, EventArg e) { if(fnull||f.IsDisposed) //注意先判断null&#xff0c;再判断IsDisposed&#xff0c;…

“指向指针的指针”的应用场景

结合以下博文来看。 值传递与地址传递的区别_天糊土的博客-CSDN博客 二维数组数和指针操作的理解_天糊土的博客-CSDN博客 “指针1”的理解_天糊土的博客-CSDN博客 多重指针操作_天糊土的博客-CSDN博客_多重指针 二重指针的应用场景 &#xff08;1&#xff09;用指针的指针指向指…

su root 和su - root 的区别

前几天&#xff0c;在一次项目中&#xff0c;犯了一个很低级的错误&#xff0c;但是没弄明白是什么问题。情况是这样的&#xff0c;我们在做灾备&#xff0c;重启系统化&#xff0c;以root用户权限&#xff0c;通过 su oracle &#xff0c;进去后&#xff0c;oracle的rac 无法正…

弹出框

<!DOCTYPE html> <html xmlns"http://www.w3.org/1999/xhtml"> <head> <meta http-equiv"Content-Type" content"text/html; charsetgb2312" /> <title>AlertBox 弹出层&#xff08;信息提示框&#xff09;效果&l…