我就是过来开心一下……这道题从开坑以来已经堆积了大半年了……今天才发现广搜一直写挂……

丢个线段覆盖的模板,设$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] 引水入城的更多相关文章

  1. 洛谷 1514 (NOIp2010) 引水入城

    题目:https://www.luogu.org/problemnew/show/P1514 如果有解,一个第一行的格子能覆盖第n行的一定是一个连续的区间. 因为如果不连续,则有围住了一些第n行的格子 ...

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

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

  3. NOIP2010 引水入城

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

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

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

  5. NOIP2010 引水入城 题解

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

  6. noip2010 引水入城 bfs+贪心

    如果能够实现,每个河边的城市对应的控制区域一定是一条线段. 所以直接bfs每个河边的城市,贪心线段的右端点 #include<cstdio> #include<cstring> ...

  7. Luogu1514 NOIP2010 引水入城 BFS、贪心

    传送门 NOIP的题目都难以写精简题意 考虑最上面一排的某一个点对最下面一排的影响是什么样的,不难发现必须要是一段连续区间才能够符合题意. 如果不是一段连续区间,意味着中间某一段没有被覆盖的部分比周围 ...

  8. luogu1514 [NOIp2010]引水入城 (bfs+记忆化搜索)

    我们先bfs一下看看是否能到最底下的所有点 如果不能的话,直接把不能到的那几个数一数就行了 如果能的话: 可以发现(并不可以)某格能到达的最底下的格子一定是一个连续的区间 (因为如果不连续的话,我们先 ...

  9. [NOIP2010] 引水入城 贪心 + 记忆化搜索

    ---题面--- 题解: 本蒟蒻并没有想到bfs的做法,,,, 只会dfs了 首先我们需要知道一个性质. 我们设k[i].l 为在i点建立水库可以支援到的最左边的城市,k[i].r为最右边的. 那么点 ...

随机推荐

  1. CCEditBox

    EditBox 创建添加 以及 一些函数参数的解析 #include "GUI/CCEditBox/CCEditBox.h" #include "GUI/CCContro ...

  2. RabbitMQ用户角色及权限控制(不错)

    ########################用户角色####################### RabbitMQ的用户角色分类:none.management.policymaker.moni ...

  3. C#中将dateTimePicker初始值设置为空

    最近在做一个小项目,有一个功能是根据用户选择条件查询数据,要求时间控件的默认值为空,只有当用户修改了时间,才根据时间查询.简单的说,就是默认或者点击清空按钮的情况下,时间控件dateTimePicke ...

  4. RequireJS 也可以引入 VUE

    RequireJS 也可以引入 VUE 由于 FastAdmin 是使用 RequireJS 导入 JS 模块的. 有人想把 VUE 也引入进去,虽然说也是可以,VUE 还是推荐使用 Webpack ...

  5. bzoj 4591 [Shoi2015]超能粒子炮·改——组合数前缀和

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4591 先说说自己的想法: 从组合意义的角度考虑,从n个里选<=k个,就添加k个空位置, ...

  6. 反射ORM 三层(for oracle)

    sql server and oracle 不同之处只在于: 1·参数@和: 2·自增和序列 3·oracle使用了存储过程以获得当前插入数据的ID DAL层的ORM using Oracle.Dat ...

  7. 引用 WCF 服务后,没有生成任何 .datasource?

    如题WCF服务生成成功,在添加服务引用的时候也不报错,但是添加完成之后不能正常调用服务借口. 在重新引用服务的时候,或者是是更新引用服务的时候,点“高级”按钮,在服务引用设置对话框中,将“重新使用引用 ...

  8. 【转】 Pro Android学习笔记(八六):了解Package(5):使用lib

    目录(?)[-] 在项目中使用lib 源代码 了解一些机制 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowin ...

  9. AngularJS:实例

    ylbtech-AngularJS:实例 1.返回顶部 1. AngularJS 实例 实例 您可以在线编辑实例,然后点击按钮查看结果. AngularJS 实例 <div ng-app=&qu ...

  10. handlebars自定义helper方法

    handlebars相对来讲算一个轻量级.高性能的模板引擎,因其简单.直观.不污染HTML的特性,我个人特别喜欢.另一方面,handlebars作为一个logicless的模板,不支持特别复杂的表达式 ...