https://vjudge.net/problem/POJ-3171。(有价值的区间全覆盖问题)


(lyd例题)朴素DP很好想,$f[i]$表示将右端点从小到大排序后从$L$(要求覆盖的大区间)到第$i$个区间的右端点都覆盖完成时最小化费。无解则为INF。然后利用排序、右端点单调性,每次枚举前面dp过的右端点落在现在左端点及其右侧(或相邻)的,去最小dp值加上现在费用。然后$O(n^2)$就可以水过啦。。因为常数特别小,数据也才1e4嘛。。优化的话因为每次查的都是一段区间里的右端点最值,所以线段树维护即可。


细节提示:

  • 注意:好像没什么注意的。。线段树因为正常写的话值域与他下标无关的,所以这题查询区间有-1什么的也无妨,在线段树中只是体现出区间不断减半,下标增多。
  • RE:空间。。。、
  • 如果区间范围较大考虑离散化,将每个区间的L-1以及R离散化即可
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. #include<queue>
  7. #define dbg(x) cerr<<#x<<" = "<<x<<endl
  8. #define ddbg(x,y) cerr<<#x<<" = "<<x<<" "<<#y<<" = "<<y<<endl
  9. using namespace std;
  10. typedef long long ll;
  11. template<typename T>inline char MIN(T&A,T B){return A>B?A=B,:;}
  12. template<typename T>inline char MAX(T&A,T B){return A<B?A=B,:;}
  13. template<typename T>inline T _min(T A,T B){return A<B?A:B;}
  14. template<typename T>inline T _max(T A,T B){return A>B?A:B;}
  15. template<typename T>inline T read(T&x){
  16. x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
  17. while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
  18. }
  19. const int N=+,M=+,INF=0x3f3f3f3f;
  20. struct kugen{
  21. int l,r,w;
  22. }A[N];
  23. inline bool cmp(kugen a,kugen b){return a.r<b.r;}
  24. int f[N],minv[M<<];
  25. #define lc i<<1
  26. #define rc i<<1|1
  27. int Query(int i,int L,int R,int ql,int qr){
  28. if(ql<=L&&qr>=R)return minv[i];
  29. int mid=L+R>>,ret=INF;
  30. if(ql<=mid)MIN(ret,Query(lc,L,mid,ql,qr));
  31. if(qr>mid)MIN(ret,Query(rc,mid+,R,ql,qr));
  32. return ret;
  33. }
  34. void Modify(int i,int L,int R,int x){
  35. if(L==R)MIN(minv[i],f[x]);
  36. else{
  37. int mid=L+R>>;
  38. A[x].r<=mid?Modify(lc,L,mid,x):Modify(rc,mid+,R,x);
  39. minv[i]=_min(minv[lc],minv[rc]);
  40. }
  41. }
  42. #undef lc
  43. #undef rc
  44. int n,m,L,R,l,r,x,ans,rb;
  45.  
  46. int main(){//freopen("test.in","r",stdin);//freopen("test.out","w",stdout);
  47. read(m),read(L),read(R);
  48. for(register int i=;i<=m;++i){
  49. read(l),read(r),read(x);
  50. if(r<L||l>R)continue;
  51. A[++n].l=_max(l,L),A[n].r=_min(R,r),A[n].w=x;
  52. MAX(rb,A[n].r);
  53. }
  54. sort(A+,A+n+,cmp);ans=INF;
  55. memset(minv,0x3f,sizeof minv);
  56. for(register int i=;i<=n;++i){
  57. if(A[i].l==L)f[i]=A[i].w;else f[i]=INF;
  58. MIN(f[i],Query(,-,rb,A[i].l-,A[i].r-)+A[i].w);
  59. Modify(,-,rb,i);
  60. if(A[i].r==R&&(f[i]^INF))MIN(ans,f[i]);
  61. }
  62. printf("%d\n",ans^INF?ans:-);
  63. return ;
  64. }

poj3171 Cleaning Shifts[DP]的更多相关文章

  1. POJ3171 Cleaning Shifts DP,区间覆盖最值

    题目大意.N个区间覆盖[T1,T2]及相应的代价S,求从区间M到E的所有覆盖的最小代价是多少. (1 <= N <= 10,000).(0 <= M <= E <= 86 ...

  2. poj3171 Cleaning Shifts【线段树(单点修改区间查询)】【DP】

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4422   Accepted: 1482 D ...

  3. [USACO2005][POJ3171]Cleaning Shifts(DP+线段树优化)

    题目:http://poj.org/problem?id=3171 题意:给你n个区间[a,b],每个区间都有一个费用c,要你用最小的费用覆盖区间[M,E] 分析:经典的区间覆盖问题,百度可以搜到这个 ...

  4. poj3171 Cleaning Shifts

    传送门 题目大意 有一个大区间和n个小区间,每个小区间都有一个代价,求最少付出多少代价可以使得小区间完全覆盖大区间. 分析为了方便起见我们先将s变为2,其它的位置都对应更改以便后期处理.我们考虑以t1 ...

  5. POJ2376 Cleaning Shifts

    题意 POJ2376 Cleaning Shifts 0x50「动态规划」例题 http://bailian.openjudge.cn/practice/2376 总时间限制: 1000ms 内存限制 ...

  6. poj2376 Cleaning Shifts【线段树】【DP】

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32561   Accepted: 7972 ...

  7. [Usaco2005 Dec]Cleaning Shifts 清理牛棚 (DP优化/线段树)

    [Usaco2005 Dec] Cleaning Shifts 清理牛棚 题目描述 Farmer John's cows, pampered since birth, have reached new ...

  8. POJ 2376 Cleaning Shifts 贪心

    Cleaning Shifts 题目连接: http://poj.org/problem?id=2376 Description Farmer John is assigning some of hi ...

  9. poj 3171 Cleaning Shifts(区间的最小覆盖价值)

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2743   Accepted: 955 De ...

随机推荐

  1. Apache Kudu

    Apache Kudu是由Cloudera开源的存储引擎,可以同时提供低延迟的随机读写和高效的数据分析能力.Kudu支持水平扩展,使用Raft协议进行一致性保证,并且与Cloudera Impala和 ...

  2. VC引用静态库

    对于路径的设置: Tools->Options->Directory中设置的Lib路径,是给VC环境设置的, 所以只要是这个VC打开的项目,都会包含这些路径. Project->Se ...

  3. json教程系列(4)-optXXX方法的使用

    在JSONObject获取value有多种方法,如果key不存在的话,这些方法无一例外的都会抛出异常.如果在线环境抛出异常,就会使出现error页面,影响用户体验,针对这种情况最好是使用optXXX方 ...

  4. 【鸟哥的Linux私房菜】笔记2

    Linux的应用 学习资源整理 安装记录 >< 1.Linux的应用: 网络服务器 数据库 学术机构的高效运算任务 嵌入式系统 ... 2.挂载与磁盘分区 学习资源整理 学习 1.书上的网 ...

  5. POJ 3253 Fence Repair 贪心+优先队列

    题意:农夫要将板割成n块,长度分别为L1,L2,...Ln.每次切断木板的花费为这块板的长度,问最小花费.21 分为 5 8 8三部分.   思路:思考将n部分进行n-1次两两合成最终合成L长度和题目 ...

  6. 设置 IntelliJ IDEA 主题和字体的方法

    1 前言 在博文「IntelliJ IDEA 之 HelloWorld 项目创建及相关配置文件介绍」中,我们已经用 IntelliJ IDEA 创建了第一个 Java 项目 HelloWorld,如下 ...

  7. struts2中常用配置

    1.Post提交乱码问题,如果编码采用的是utf-8,那么默认不需要自己处理,因为其默认的常量配置文件就是处理UTF-8的 这个常量值只处理POST提交,get如果乱码还得自己写拦截器处理,一般只要页 ...

  8. RabbitMQ死信队列

    关于RabbitMQ死信队列 死信队列 听上去像 消息“死”了     其实也有点这个意思,死信队列  是 当消息在一个队列 因为下列原因: 消息被拒绝(basic.reject/ basic.nac ...

  9. 如何使用REST请求风格

    REST:即 Representational State Transfer.(资源)表现层状态转化.是目前最流行的一种互联网软件架构. 它结构清晰.符合标准.易于理解.扩展方便, 所以正得到越来越多 ...

  10. Anton and School - 2 (组合数学)

    题意:给你一串只有‘(’与‘)’的字符串,问你多少对括号,括号一定是左边一半的‘(’,右边一半是‘)’ )(()()   答案是:6 题解:枚举每个‘(’,此时设左括号左边有n个‘(’,它右边有m个‘ ...