(和 poj1769 几乎一样,利用线段树dp的基础题)

题目大概意思为选几个区间,使 M 到 E 全都被覆盖,求选取区间的最少数量
(我们把从 M 到 E 转化成从 1 到 E - M + 1 )
且对于输入我们需要先排序排序一下

dp[i][j] : 意思为到第 i 个区间为止,能 刚好 覆盖到 j 的最小区间数目
例:区间为【1,10】,【5,20】,则 dp[1][10] = 1; dp[2][20] = 2; dp[2][19] = INF;
此时影响当前阶段的只有前一阶段的状态,无后效性,所以 dp 可行

预处理,i = 0时,dp[0][0] = 0; dp[0][j] = INF; ( 初始情况什么都没有被覆盖 )

那 dp[i+1][j] 怎么处理?
假设 i + 1 区间的左右界分别为 a 和 b,我们遍历 dp[i][a - 1] 到 dp[i][b-1],找到其中最小值 c(这代表可以接上第 i + 1 个区间)
假设d = dp[i][[b]( 即到 i 区间为止,最少用 d 个区间可以覆盖到 b )
如果 c < d - 1,便将 dp[i+1][b] 更新为 c + 1

我们可以将数组优化为一维数组,dp[j] 也能正确运行

我们不难发现,我们进行了大量的 修改 和 关于区间的查找最小值操作 ,此模型符合线段树的RMQ结构
我们可以把 dp 数组 转化为 线段树 dat 数组,可大幅缩短时间复杂度

然后套模板即可,代码如下:

#include <iostream>
#include <stdio.h>
#include <algorithm>
#define INF 1000000005
using namespace std;
int n;
int dat[(1<<20)+5];
struct ddd
{int a, b, c;
};
void init(int n_)
{n = 1;while(n < n_) n *= 2;for(int i = 0; i < 2 * n - 1; i++) dat[i] = INF;
}
void update(int k, int a)
{k += n - 1;dat[k] = a;while(k > 0){k = (k - 1) / 2;dat[k] = min(dat[k*2+1], dat[k*2+2]);}
}
bool cmp(struct ddd a, struct ddd b)
{if(a.a == b.a){return a.b < b.b;}return a.a < b.a;
}
int query(int a, int b, int k, int l, int r)
{if(r <= a || b <= l) return INF;if(a <= l && r <= b) return dat[k];else{int vl = query(a, b, k * 2 + 1, l, (l + r) / 2);int vr = query(a, b, k * 2 + 2, (l + r) / 2, r);return min(vl, vr);}
}
int main()
{int num, p, q;struct ddd data[10005];scanf("%d %d %d", &num, &p, &q);q = q - p + 1;init(q + 1);update(0, 0);for(int i = 0; i < num; i++){scanf("%d %d %d", &data[i].a, &data[i].b, &data[i].c);}sort(data, data + num, cmp);for(int i = 0; i < num; i++){int a, b, c = data[i].c;a = data[i].a - p + 1;b = data[i].b - p + 1;int d = query(a - 1, b, 0, 0, n + 1);int e = query(b, n + 1, 0, 0, n + 1);if(d <= e - c){update(b, d + c);}}if(dat[q+n-1] == INF){printf("-1\n");}else{printf("%d\n", dat[q+n-1]);}
}

poj3171(dp + 线段树)相关推荐

  1. hdu5489 Removed Interval dp+线段树优化

    现在看这题居然直接秒了...去年看的时候还以为神题.. 设以第i项为结尾的lis前缀为f[i],以第j项为结尾的lis后缀为g[i],如果求出f[i]和g[j],然后枚举i,快速找到最大的满足a[j] ...

  2. [动态dp]线段树维护转移矩阵

    背景:czy上课讲了新知识,从未见到过,总结一下. 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法. 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑修改,不考虑区 ...

  3. Codeforces Round #699 (Div. 2) E.Sorting Books(贪心+DP / 线段树)超高质量题解,看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 E - Sorting Books 一排书架上有 nnn 本书排成一排,每本书上有一个颜色 aia_i ...

  4. poj1769(dp + 线段树)

    题目大概意思为选几个区间,使 1 到 n 全都被覆盖,求选取区间的最少数量 dp[i][j] : 意思为到第 i 个区间为止,能刚好覆盖到 j 的最小区间数目 例:区间为[1,10],[5,20],则 ...

  5. Codeforces 833B 题解(DP+线段树)

    题面 传送门:http://codeforces.com/problemset/problem/833/B B. The Bakery time limit per test2.5 seconds m ...

  6. BZOJ 1852 [MexicoOI06]最长不下降序列(贪心+DP+线段树+离散化)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1852 [题目大意] 给你N对数A1,B1--An,Bn.要求你从中找出最多的对, 把它 ...

  7. 【BZOJ】1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚(dp/线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1672 dp很好想,但是是n^2的..但是可以水过..(5s啊..) 按左端点排序后 f[i]表示取第 ...

  8. Codeforces 671D. Roads in Yusland(树形DP+线段树)

    调了半天居然还能是线段树写错了,药丸 这题大概是类似一个树形DP的东西.设$dp[i]$为修完i这棵子树的最小代价,假设当前点为$x$,但是转移的时候我们不知道子节点到底有没有一条越过$x$的路.如果 ...

  9. BZOJ-2298|区间dp|线段树

    problem a Description 一次考试共有n个人参加,第i个人说:"有ai个人分数比我高,bi个人分数比我低."问最少有几个人没有说真话(可能有相同的分数) Inpu ...

最新文章

  1. 【转】Odoo装饰器: one装饰
  2. 图解understand分析一个asp.net办公系统源码
  3. 为什么JavaScript现在和将来都是编程语言首选?
  4. order by、group by也会使用索引?使用这俩关键字的时候索引什么时间会失效
  5. 李善友《认知升级之第一性原理》--507张PPT全解!_搜狐科技_搜狐网
  6. 实录分享 | 计算未来轻沙龙:揭秘AutoML技术(视频 + PPT)
  7. Endnote生成的中英文混排参考文献中“等”与“et al”的处理
  8. JS实现逼真的雪花飘落特效
  9. vue-day04-vue前端交互
  10. 斯坦福华人教授:声波、光波,其实都是RNN!机器学习模型对应
  11. J2EE的13个规范之(二) JDBC 及其使用
  12. MySQL数据库和表名大小写敏感开关的打开办法
  13. python中的thread_深入理解Python中的ThreadLocal变量(上)
  14. maven添加ojdbc6.jar包
  15. android boss简历,BOSS简历模板
  16. 何凯明最新一作MAE解读系列1
  17. arm-linux驱动开发学习7
  18. Connection could not be established with host smtp.163.com 阿星小栈
  19. linux cadaver 命令,【Linux学习第三篇】[Tab].[Ctrl]-c.[Ctrl]-d
  20. 《ASP.NET程序设计教程》目录

热门文章

  1. 链表问题14——在单链表种删除指定值的节点(方法二)
  2. mysql存储、function、触发器等实例
  3. 【Kafka】Kafka数据可靠性深度解读
  4. linux 能访问内网,但不能访问外网?解决方案
  5. ORACLE数据库对比表结构
  6. 用C语言实现素数筛法获取一亿(100000000)以内的全部素数
  7. 华为总裁任正非谈企业管理:正确的方向来自于妥协
  8. hadoop错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster
  9. leetcode006 zig_zig_print
  10. 制作静态链接库和动态链接库