题目:https://www.luogu.org/problemnew/show/P1514

如果有解,一个第一行的格子能覆盖第n行的一定是一个连续的区间。

  因为如果不连续,则有围住了一些第n行的格子却流不过去的情况。这样被围住的格子肯定谁都流不到它。

!!必须加第54行的判断!不然会无限TLE。dfs似乎是爆栈。那bfs为什么也不行?

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7. const int N=;
  8. int n,m,a[N][N],ct;
  9. int fx[]={-,,,},fy[]={,-,,};
  10. bool fg[N],vis[N][N];
  11. struct Node{
  12. int l,r;
  13. }b[N],q[N];
  14. bool check(int x,int y,int i)
  15. {
  16. int tx=x+fx[i],ty=y+fy[i];
  17. if(tx>=&&tx<=n&&ty>=&&ty<=m&&a[tx][ty]<a[x][y]&&!vis[tx][ty])return true;
  18. return false;
  19. }
  20. void dfs(int x,int y,int rt)
  21. {
  22. vis[x][y]=;
  23. if(x==n){
  24. fg[y]=;b[rt].l=min(b[rt].l,y);
  25. b[rt].r=max(b[rt].r,y);
  26. }
  27. for(int i=;i<;i++)
  28. if(check(x,y,i))
  29. dfs(x+fx[i],y+fy[i],rt);
  30. }
  31. //void bfs(int rt)
  32. //{
  33. // queue<pair<int,int> > qu;
  34. // qu.push(make_pair(1,rt));vis[1][rt]=1;
  35. // while(qu.size())
  36. // {
  37. // int x=qu.front().first,y=qu.front().second;
  38. // qu.pop();
  39. // if(x==n){fg[y]=1;b[rt].l=min(b[rt].l,y);b[rt].r=max(b[rt].r,y);}
  40. // for(int i=0;i<4;i++) if(check(x,y,i))
  41. // {
  42. // vis[x+fx[i]][y+fy[i]]=1;
  43. // qu.push(make_pair(x+fx[i],y+fy[i]));
  44. // }
  45. // }
  46. //}
  47. bool cmp(Node u,Node v){return u.l==v.l?u.r>v.r:u.l<v.l;}
  48. int main()
  49. {
  50. scanf("%d%d",&n,&m);
  51. for(int i=;i<=n;i++)for(int j=;j<=m;j++)scanf("%d",&a[i][j]);
  52. for(int i=;i<=m;i++)
  53. {
  54. if(a[][i-]>a[][i]||a[][i+]>a[][i])continue;////////
  55. memset(vis,,sizeof vis);vis[][i]=;
  56. b[i].l=m+;dfs(,i,i);
  57. }
  58. int cnt=;
  59. for(int i=;i<=m;i++)if(!fg[i])cnt++;
  60. if(cnt){
  61. printf("0\n%d",cnt);return ;
  62. }
  63. sort(b+,b+m+,cmp);
  64. for(int i=;i<=m;i++)
  65. {
  66. q[++ct]=b[i];
  67. while(b[i].l==b[i+].l)i++;
  68. }
  69. q[ct+].l=m+;
  70. int now=,cr=,k=;
  71. while(now<m)
  72. {
  73. for(;q[cr].l<=now+;cr++)k=max(k,q[cr].r);
  74. now=k;cnt++;
  75. }
  76. printf("1\n%d",cnt);
  77. return ;
  78. }

洛谷 1514 (NOIp2010) 引水入城的更多相关文章

  1. [洛谷P1514] NOIP2010 引水入城

    问题描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行×M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...

  2. 洛谷 P1514 【引水入城】

    题库 :洛谷 题号 :1514 题目 :引水入城 link :https://www.luogu.org/problemnew/show/P1514 思路 :搜索从第一排开始能覆盖最后一排的区间L ~ ...

  3. 【题解】洛谷P1514 [NOIP2010TG] 引水入城(DFS+DP)

    次元传送门:洛谷P1514 思路 可以证明如果有解 那么每个蓄水池可以覆盖到的干旱区必定是线段 证明: 举个栗子 8 9 8 7 9 7 6 9 6 明显到不了中间的点 如果不是连续的线段 中间肯定有 ...

  4. Luogu 1514 [NOIP2010] 引水入城

    我就是过来开心一下……这道题从开坑以来已经堆积了大半年了……今天才发现广搜一直写挂…… 丢个线段覆盖的模板,设$f_{i}$表示覆盖区间[1, i]的最小代价,$g_{i, j}$表示覆盖区间[i, ...

  5. 521. [NOIP2010] 引水入城 cogs

    521. [NOIP2010] 引水入城 ★★★   输入文件:flow.in   输出文件:flow.out   简单对比时间限制:1 s   内存限制:128 MB 在一个遥远的国度,一侧是风景秀 ...

  6. NOIP2010 引水入城

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

  7. 题解【洛谷P1514】[NOIP2010]引水入城

    题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 \(N\) 行 \(M\) 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市 ...

  8. NOIP2010引水入城[BFS DFS 贪心]

    题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...

  9. NOIP2010 引水入城 题解

    http://www.rqnoj.cn/problem/601 今天发现最小区间覆盖竟然是贪心,不用DP!于是我又找到这题出来撸了一发. 要找到最上面每个城市分别能覆盖最下面哪些城市,如果最下面有城市 ...

随机推荐

  1. 逆序对算法(reverse pair)

    逆序对(reverse-pair) 思想和归并排序的思想一样,时间复杂度是O(nlgn). 就是在统计逆序对个数的表达式需要注意一下. 具体实现 #include <iostream> # ...

  2. LVS+Keepalived+Tomcat实现高可用性及均衡负载

    1.Keepalived简介 Keepalived是Linux下一个轻量级别的高可用解决方案.Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考 ...

  3. spark学习11(Wordcount程序-本地测试)

    wordcount程序 文件wordcount.txt hello wujiadong hello spark hello hadoop hello python 程序示例 package wujia ...

  4. jQuery和javaScript页面加载完成时触发的事件

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. xml的servlet配置

    内容如下 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="ht ...

  6. Java中的逻辑运算符

    逻辑运算符主要用于进行逻辑运算.Java 中常用的逻辑运算符如下表所示: 我们可以从“投票选举”的角度理解逻辑运算符: 1. 与:要求所有人都投票同意,才能通过某议题 2. 或:只要求一个人投票同意就 ...

  7. DPDK编程指南 2.概述

    本章节给出了DPDK架构的一个全局概述. DPDK的主要目的就是为数据面快速报文处理应用程序提供一个简洁完整的框架.用户可以通过代码来理解其中使用的一些技术,构建自己的应用程序或添加自己的协议栈.Al ...

  8. coredata 数据库升级

    在真实开发中,因为需求是不断变化的,说不定什么时候就需要往模型里添加新的字段,添加新的模型,甚至是大规模的重构:所以数据的迁移就显得尤为重要了. CoreData 中,数据迁移本质就是把旧的 SQLi ...

  9. MailUtils 测试邮件是否发送

    import java.util.Properties; import javax.mail.Message; import javax.mail.Session; import javax.mail ...

  10. 七 web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术、设置用户代理

    如果爬虫没有异常处理,那么爬行中一旦出现错误,程序将崩溃停止工作,有异常处理即使出现错误也能继续执行下去 1.常见状态吗 301:重定向到新的URL,永久性302:重定向到临时URL,非永久性304: ...