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

丢个线段覆盖的模板,设$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. Ajax与后台的交互

    Ajax Java 交互 jsp代码 <%@ page language="java" import="java.util.*" pageEncoding ...

  2. unity 四元数, 两行等价的代码

    Vector3 tmpvc; 1. tmpvc = Quaternion.Euler (new Vector3 (0, 30, 0)) * new Vector3 (0, 0, 1); 2. tmpv ...

  3. android sdk国内服务器下载

    推荐使用国内东软的服务器下载android sdk相关: 如果是android sdk manager: HTTP Proxy Server : mirrors.neusoft.edu.cn HTTP ...

  4. XE7 UTF8Encode

    之前用D7写的客户端程序升级到XE7,服务端依旧用D7.使用TIdHTTP控件 Get(URL)方法,服务端(TIdHttpServer)收到的中文字符解释成乱码. 鼓捣了一会,这么搞定的: 1. 客 ...

  5. HihoCoder1445 重复旋律5(后缀自动机)

    重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数列. 现在小Hi想知道一部作品 ...

  6. Cheapest Palindrome(区间DP)

    个人心得:动态规划真的是够烦人的,这题好不容易写出了转移方程,结果超时,然后看题解,为什么这些题目都是这样一步一步的 递推,在我看来就是懵逼的状态,还有那个背包也是,硬是从最大的V一直到0,而这个就是 ...

  7. [SPOJ10707]Count on a tree II

    luogu 题意 给定一个n个节点的树,每个节点表示一个整数,问u到v的路径上有多少个不同的整数. sol 也就是路径数颜色.树上莫队板子题. 我这种分块的姿势貌似是假的. 所以跑的是最慢的QAQ. ...

  8. 5.7 Windows常用网络命令

    5.7 Windows常用网络命令 •ping •netstat •winipcfg/ipconfig •tracert •route 5.7.1 ping命令 •功能 –它是用来检查网络是否通畅或者 ...

  9. 洛谷【P1004】方格取数

    浅谈\(DP\):https://www.cnblogs.com/AKMer/p/10437525.html 题目传送门:https://www.luogu.org/problemnew/show/P ...

  10. 6、Selenium+Python登录案例 -- Github

    一:登录 1.指定浏览器,打开网址:https://github.com/login 2.设置等待时间: time.sleep(3) or driver.implicitly_wait(3) 3.输入 ...