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为最右边的. 那么点 ...
随机推荐
- 完成一个servlet 就要在web.xml里面配一个映射,这样就有一个路径供我们 使用????? servlet从页面接收值?
最后,最容易忘记的是:在dao层中 调用xml里的删除sql语句 后面需要人为加上事务提交.一定要! sqlSession.commit();//jdbc是自动提交,但是mybatis中不是自动提交的 ...
- 2017-2018-1 20179215《Linux内核原理与分析》第十二周作业
Sql注入基础原理介绍 分组:和20179205王雅哲共同完成实验 一.实验说明 1.1 sql注入 SQL注入攻击通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组 ...
- 1625 codevs数字金字塔
1625 数字金字塔 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 考虑在下面被显示的数字金字塔. 写 ...
- kali_linux学习笔记
kali linux ssh登陆: 一.配置SSH参数 修改sshd_config文件,命令为: vi /etc/ssh/sshd_config 将#PasswordAuthentication no ...
- git常用命令备忘录
返回未修改状态 [git checkout . --没有的提交的,都返回到原来的状态 git clean -xdf 删除文件和目录] git checkout . && git cl ...
- 学习动态性能表(15)--v$rollstat
学习动态性能表 第15篇--V$ROLLSTAT 2007.6.12 本视图自启动即保持并记录各回滚段统计项.在学习本视图之前,我们先来了解一下回滚段(rollback segment)的相关概念: ...
- Java邮箱发送——企业版
企业版邮箱发送工具类 import java.security.Security; import java.util.Properties; import javax.mail.Authenticat ...
- AngularJS:应用
ylbtech-AngularJS:应用 1.返回顶部 1. AngularJS 应用 现在是时候创建一个真正的 AngularJS 单页 Web 应用(single page web applica ...
- maven学习6 Eclipse下Tomcat常用设置
Eclipse下Tomcat常用设置 1,Eclipse建立Tomcat服务 1.1 新建Server 首先这里是指,jee版的Eclipse.Eclipse是没有像MyEclipse那样集成Tomc ...
- ruby中nil?, empty? and blank?
In Ruby, you check with nil? if an object is nil: article = nil article.nil? # => true empty? che ...