「NOIP2010」引水入城
传送门
Luogu
解题思路
第一问很好做,只要总第一行的每一个点都跑一边dfs,判断最后一行是否有点标记不了即可。
考虑处理第二问。
其实这一问就是:
把第一行的点都看做是对最后一行一些点的覆盖,求最后一行那段区间的最小覆盖数。
我们可以发现这样一个事情:
每一个第一行的点在最后一行覆盖的都是一段连续的区间。
证明:
假设一个点它的水流只可以覆盖两个最后一行的两端不相邻区间(多段类似)。
那么在有解的前提下,必定会有一条水流流入中间那块没被覆盖的区域,
而这条水流一定会与第一条水流相交,这就意味着第一条水流可以在交点处分一条支流 从而覆盖整个区间,与假设矛盾。
所以我们可以在dfs时预处理出每个第一行节点对应的区间,然后贪心地去选点就好了。
细节注意事项
- 第一次没用上vis标记居然还只T了两个点hhh
参考代码
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <ctime>
#define rg register
using namespace std;
template < typename T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while (!isdigit(c)) f |= c == '-', c = getchar();
while (isdigit(c)) s = s * 10 + (c ^ 48), c = getchar();
s = f ? -s : s;
}
const int _ = 502;
const int dx[] = { 1, -1, 0, 0 };
const int dy[] = { 0, 0, 1, -1 };
int n, m, d[_][_];
int vis[_][_], l[_][_], r[_][_];
inline void dfs(int i, int j) {
if (vis[i][j]) return; vis[i][j] = 1;
for (rg int k = 0; k < 4; ++k) {
int ni = i + dx[k], nj = j + dy[k];
if (ni < 1 || ni > n || nj < 1 || nj > m) continue;
if (d[ni][nj] >= d[i][j]) continue;
dfs(ni, nj);
l[i][j] = min(l[i][j], l[ni][nj]);
r[i][j] = max(r[i][j], r[ni][nj]);
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in.in", "r", stdin);
#endif
read(n), read(m);
for (rg int i = 1; i <= n; ++i)
for (rg int j = 1; j <= m; ++j)
read(d[i][j]);
memset(l, 0x3f, sizeof l);
memset(r, 0, sizeof r);
for (rg int j = 1; j <= m; ++j)
l[n][j] = r[n][j] = j;
for (rg int j = 1; j <= m; ++j)
if (!vis[1][j]) dfs(1, j);
int cnt = 0;
for (rg int j = 1; j <= m; ++j)
cnt += !vis[n][j];
if (cnt) { printf("0\n%d\n", cnt); return 0; }
int ans = 0;
for (rg int R, L = 1; L <= m; L = R + 1) {
R = 0;
for (rg int j = 1; j <= m; ++j)
if (l[1][j] <= L) R = max(R, r[1][j]);
++ans;
}
printf("1\n%d\n", ans);
return 0;
}
完结撒花 \(qwq\)
「NOIP2010」引水入城的更多相关文章
- 「NOIP2010」「LuoguP1514」引水入城
Description 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 N×M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一 ...
- 【NOIP2010】引水入城
以前一直以为是什么高端DP,看了题解才发现是水题,老是这样看题解才能写出来到赛场上怎么办嘛QAQ 原题: 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好 ...
- 521. [NOIP2010] 引水入城 cogs
521. [NOIP2010] 引水入城 ★★★ 输入文件:flow.in 输出文件:flow.out 简单对比时间限制:1 s 内存限制:128 MB 在一个遥远的国度,一侧是风景秀 ...
- NOIP2010 引水入城
4引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个 ...
- luoguP1514 引水入城 题解(NOIP2010)(Bfs+贪心)
P1514 引水入城 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<c ...
- 洛谷P1514 [NOIP2010提高组T4]引水入城
P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城 ...
- vijos p1777 引水入城(bfs+贪心)
引水入城 描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N行M列的矩形,其中每个格子都代表一座城市,每座城市都有一个海拔高度. 为了使 ...
- 【五一qbxt】day7-1 引水入城
[noip2010 洛谷p1514]引水入城 Before: 线段覆盖问题#1:(我们所需要的) 一个区间,若干条线段,现在求最少多少条线段覆盖满整个区间 区间长度8,可选的覆盖线段[2,6],[1, ...
- Codevs 1066 引水入城 2010年NOIP全国联赛提高组
1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 在一个遥远的国度 ...
随机推荐
- EASYUI combobox firefox 下不支持中文检索
firefox 中文录入因为输入法的问题,无法出发检索的事件.网上的方法试过还是没有解决. 于是使用录入时新增一个模拟键shift,触发keydown事件,最终实现需要的效果. $("inp ...
- 使用maven搭建web项目
在pom.xml中添加java ee相关的三个依赖包:<scope> jar的有效范围 provided 表示编译期生效,不会打包发布到 tomcat 中 <properties&g ...
- CSS - 背景半透明
就一句话 background: rgba(0, 0, 0, .2); body { background-color: pink; } div { width: 200px; height: 200 ...
- IDEA call Hierarchy 双击跳转源码后绿色选中背景不消失问题
1.版本,2019.2.2. 2.这个问题貌似是个bug,就是选中变色后会一直在,目前没有找到对应方法或者配置,如果你找到了,欢迎在评论中分享一下. 3.我这里只能先简单粗暴处理下,通过设置选中时不设 ...
- BlockingQueue的几个实现分析
ArrayBlockingQueue 底层以数组的结构存放队列元素,容量大小不可改变. 先看下变量: items:数组,用于存放队列中的元素 takeIndex:获取元素的索引位置 putIndex: ...
- HHR计划---作业复盘-直播第三课
一,出租车广告: 1,三个点不合格:周期太长了,大而全互联网产品,不符合MVP原则:业务关键点丢掉了:没有业务认知和成长. 2,关键假设: (1)车主有没有需求呀,画像怎么样? (2)车主收入如何,能 ...
- Java基础 -2.3
浮点数类型 所有的数据类型进行自动转型的时候都是由小类型到大类型进行自动转换处理.默认的类型为double,但是也可以定义位数相对较少的float变量 ,此时从赋值的时候就必须采用强制类型转换 pub ...
- Linu计划任务/crontab命令
周期性任务计划 相关程序包: cronie:主程序包,提供了crond守护进程及相关辅助工具 cronie-anacron:cronie的补充程序:用于监控cronie任务执行状况:如cronie中的 ...
- 实用类-<Math类常用>
Math.random() //取0~1之间的随机数(不包括1) Math.max(数字1,数字2) //取两个数中最大的一个 Math.min(数字1,数字2) //取两个数中最小的一个 Math. ...
- Py西游攻关之基础数据类型(一)-数字字符串字节布尔
Py西游攻关之基础数据类型 - Yuan先生 https://www.cnblogs.com/yuanchenqi/articles/5782764.html 数据类型 计算机顾名思义就是可以做数学计 ...