Luogu 1514 [NOIP2010] 引水入城
我就是过来开心一下……这道题从开坑以来已经堆积了大半年了……今天才发现广搜一直写挂……
丢个线段覆盖的模板,设$f_{i}$表示覆盖区间[1, i]的最小代价,$g_{i, j}$表示覆盖区间[i, j]的代价,有转移方程
$f_{i} = f_{j} + g_{j + 1, i}$ $(0 < j < i)$
这道题直接暴力跑转移就可以了,但是对于一些n比较大的题,可以写一个前向星或者是vector存右端点一样的线段,这样子会快很多
还有要注意n = 1的坑点
放个提交记录给自己警示一下!https://www.luogu.org/recordnew/lists?uid=60553&pid=1514
Code:
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std; const int N = ;
const int dx[] = {-, , , }, dy[] = {, , , -};
const int inf = 0x3f3f3f3f; int n, m, a[N][N], f[N], g[N][N], ran[N][], tot = , head[N];
bool cov[N], vis[N], vis2[N][N]; struct Segment {
int ln, nxt;
} s[N]; inline void add(int ln, int rn) {
s[++tot].ln = ln;
s[tot].nxt = head[rn];
head[rn] = tot;
} inline void read(int &X) {
X = ;
char ch = ;
int op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline int max(int x, int y) {
return x > y ? x : y;
} inline int min(int x, int y) {
return x > y ? y : x;
} struct Node {
int x, y;
};
queue <Node> Q; inline bool vivid(Node now) {
return now.x >= && now.x <= n && now.y >= && now.y <= m;
} void bfs(int fir) {
memset(vis2, , sizeof(vis2));
vis2[][fir] = ;
int ln = inf, rn = -inf;
Q.push((Node) {, fir});
if(n == ) {
cov[fir] = ;
ln = rn = fir;
} vis[fir] = ; for(; !Q.empty(); ) {
Node out = Q.front(); Q.pop();
for(int i = ; i < ; i++) {
Node in = (Node) {out.x + dx[i], out.y + dy[i]};
if(vivid(in) && a[out.x][out.y] > a[in.x][in.y] && !vis2[in.x][in.y]) {
if(in.x == ) vis[in.y] = ;
if(in.x == n) {
cov[in.y] = ;
ln = min(ln, in.y);
rn = max(rn, in.y);
}
vis2[in.x][in.y] = ;
Q.push(in);
}
}
}
// printf("%d %d %d\n", fir, ln, rn);
if(ln > rn) return; for(int i = ln; i <= rn; i++) {
for(int j = i; j <= rn; j++) {
g[i][j] = ;
if(i == ) f[j] = ;
}
}
} int main() {
// freopen("1.in", "r", stdin); read(n), read(m);
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++)
read(a[i][j]);
memset(g, 0x3f, sizeof(g));
memset(f, 0x3f, sizeof(f));
for(int i = ; i <= m; i++)
if(!vis[i]) bfs(i); int cnt = ;
for(int i = ; i <= m; i++)
if(!cov[i]) cnt++; if(cnt > ) {
printf("0\n%d\n", cnt);
return ;
} /* for(int i = 1; i <= m; i++)
printf("%d ", f[i]);
printf("\n"); */ for(int i = ; i <= m; i++)
for(int j = ; j <= i; j++)
f[i] = min(f[i], f[j] + g[j + ][i]);
printf("1\n%d\n", f[m]); return ;
}
Luogu 1514 [NOIP2010] 引水入城的更多相关文章
- 洛谷 1514 (NOIp2010) 引水入城
题目:https://www.luogu.org/problemnew/show/P1514 如果有解,一个第一行的格子能覆盖第n行的一定是一个连续的区间. 因为如果不连续,则有围住了一些第n行的格子 ...
- 521. [NOIP2010] 引水入城 cogs
521. [NOIP2010] 引水入城 ★★★ 输入文件:flow.in 输出文件:flow.out 简单对比时间限制:1 s 内存限制:128 MB 在一个遥远的国度,一侧是风景秀 ...
- NOIP2010 引水入城
4引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个 ...
- NOIP2010引水入城[BFS DFS 贪心]
题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...
- NOIP2010 引水入城 题解
http://www.rqnoj.cn/problem/601 今天发现最小区间覆盖竟然是贪心,不用DP!于是我又找到这题出来撸了一发. 要找到最上面每个城市分别能覆盖最下面哪些城市,如果最下面有城市 ...
- noip2010 引水入城 bfs+贪心
如果能够实现,每个河边的城市对应的控制区域一定是一条线段. 所以直接bfs每个河边的城市,贪心线段的右端点 #include<cstdio> #include<cstring> ...
- Luogu1514 NOIP2010 引水入城 BFS、贪心
传送门 NOIP的题目都难以写精简题意 考虑最上面一排的某一个点对最下面一排的影响是什么样的,不难发现必须要是一段连续区间才能够符合题意. 如果不是一段连续区间,意味着中间某一段没有被覆盖的部分比周围 ...
- luogu1514 [NOIp2010]引水入城 (bfs+记忆化搜索)
我们先bfs一下看看是否能到最底下的所有点 如果不能的话,直接把不能到的那几个数一数就行了 如果能的话: 可以发现(并不可以)某格能到达的最底下的格子一定是一个连续的区间 (因为如果不连续的话,我们先 ...
- [NOIP2010] 引水入城 贪心 + 记忆化搜索
---题面--- 题解: 本蒟蒻并没有想到bfs的做法,,,, 只会dfs了 首先我们需要知道一个性质. 我们设k[i].l 为在i点建立水库可以支援到的最左边的城市,k[i].r为最右边的. 那么点 ...
随机推荐
- mac下用brew安装mongodb
分享到:QQ空间新浪微博腾讯微博人人网微信 mac 下安装mongoDB一般俩种方法. (1)下载源码,解压,编译,配置,启动 比较艰难的一种模式. (2)brew install mongodb , ...
- 完成一个servlet 就要在web.xml里面配一个映射,这样就有一个路径供我们 使用????? servlet从页面接收值?
最后,最容易忘记的是:在dao层中 调用xml里的删除sql语句 后面需要人为加上事务提交.一定要! sqlSession.commit();//jdbc是自动提交,但是mybatis中不是自动提交的 ...
- Android Studio 开始运行错误
/******************************************************************************** * Android Studio 开 ...
- 【pandas】pandas.DataFrame.rename()---重置索引名称
官方文档 github地址 例子: 创建DataFrame ### 导入模块 import numpy as np import pandas as pd import matplotlib.pypl ...
- 小组项目需求——NABCD
关于项目微食堂的NABCD: N(need): 就我自己而言,每天在上午三四节课时就会想中午吃什么.而且大部分的课在二教,离食堂较远.可能会面临“抢不到饭”的问题.首先不知道去哪吃.吃什么,尤其在时间 ...
- 《Javascript高级程序设计》阅读记录(二):第四章
这个系列之前文字地址:http://www.cnblogs.com/qixinbo/p/6984374.html 这个系列,我会把阅读<Javascript高级程序设计>之后,感觉讲的比较 ...
- 杂项之rabbitmq
杂项之rabbitmq 本节内容 rabbitmq简介 AMQP协议 rabbitmq使用 应用举例 rabbitmq简介 介绍rabbitmq之前,先介绍一下AMQP协议,因为rabbitmq就是基 ...
- 利用GPU实现翻页效果(分享自知乎网)
https://zhuanlan.zhihu.com/p/28836892?utm_source=qq&utm_medium=social 首发于Runtime 写文章 利用GPU实现翻页效果 ...
- Linux动态gif图的录制
Linux动态gif图的录制 Linux动态gif图的录制 byzanz的安装与使用 recordmydesktop再convert成gif 参考资料 前几天写了两篇博客vim的配置和Vim的自动代码 ...
- Python collections系列之可命名元组
可命名元组(namedtuple) 根据nametuple可以创建一个包含tuple所有功能以及其他功能的类 1.创建一个坐标类 import collections # 创建类, defaultd ...