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


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


细节提示:

  • 注意:好像没什么注意的。。线段树因为正常写的话值域与他下标无关的,所以这题查询区间有-1什么的也无妨,在线段树中只是体现出区间不断减半,下标增多。
  • RE:空间。。。、
  • 如果区间范围较大考虑离散化,将每个区间的L-1以及R离散化即可
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define dbg(x) cerr<<#x<<" = "<<x<<endl
#define ddbg(x,y) cerr<<#x<<" = "<<x<<" "<<#y<<" = "<<y<<endl
using namespace std;
typedef long long ll;
template<typename T>inline char MIN(T&A,T B){return A>B?A=B,:;}
template<typename T>inline char MAX(T&A,T B){return A<B?A=B,:;}
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int N=+,M=+,INF=0x3f3f3f3f;
struct kugen{
int l,r,w;
}A[N];
inline bool cmp(kugen a,kugen b){return a.r<b.r;}
int f[N],minv[M<<];
#define lc i<<1
#define rc i<<1|1
int Query(int i,int L,int R,int ql,int qr){
if(ql<=L&&qr>=R)return minv[i];
int mid=L+R>>,ret=INF;
if(ql<=mid)MIN(ret,Query(lc,L,mid,ql,qr));
if(qr>mid)MIN(ret,Query(rc,mid+,R,ql,qr));
return ret;
}
void Modify(int i,int L,int R,int x){
if(L==R)MIN(minv[i],f[x]);
else{
int mid=L+R>>;
A[x].r<=mid?Modify(lc,L,mid,x):Modify(rc,mid+,R,x);
minv[i]=_min(minv[lc],minv[rc]);
}
}
#undef lc
#undef rc
int n,m,L,R,l,r,x,ans,rb; int main(){//freopen("test.in","r",stdin);//freopen("test.out","w",stdout);
read(m),read(L),read(R);
for(register int i=;i<=m;++i){
read(l),read(r),read(x);
if(r<L||l>R)continue;
A[++n].l=_max(l,L),A[n].r=_min(R,r),A[n].w=x;
MAX(rb,A[n].r);
}
sort(A+,A+n+,cmp);ans=INF;
memset(minv,0x3f,sizeof minv);
for(register int i=;i<=n;++i){
if(A[i].l==L)f[i]=A[i].w;else f[i]=INF;
MIN(f[i],Query(,-,rb,A[i].l-,A[i].r-)+A[i].w);
Modify(,-,rb,i);
if(A[i].r==R&&(f[i]^INF))MIN(ans,f[i]);
}
printf("%d\n",ans^INF?ans:-);
return ;
}

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. Oracle数据库的启动与关闭

    一.概述: Oracle数据库的启动分为启动数据库实例.装载数据库和打开数据库3个过程,对应数据库的3种模式. 启动数据库实例:根据数据库初始化参数文件中参数设置,在内存中为数据库分配SGA.PGA等 ...

  2. 树莓派使用DHT11温湿度传感器(C语言程序)

    pi4j是基于wiringpi开发的通过java来控制树莓派GPIO口的库文件.在java程序中引入相关类就可以使用已经封装好的方法控制树莓派GPIO口. pi4j官网:http://pi4j.com ...

  3. Vue.js学习笔记 第八篇 组件

    全局注册组件 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...

  4. Kubernetes Ingress

    Kubernetes关于服务的暴露主要是通过NodePort方式,通过绑定node主机的某个端口,然后进行pod的请求转发和负载均衡,但这种方式下缺陷是 Service可能有很多个,如果每个都绑定一个 ...

  5. SQL Server technical bulletin - How to resolve a deadlock

    https://support.microsoft.com/en-us/help/832524/sql-server-technical-bulletin-how-to-resolve-a-deadl ...

  6. linux基础(8)-颜色显示

    echo显示内容-带颜色显示 格式:echo -e "\033[字体背景颜色;文字颜色m字符串 \033[0m" 实例:echo -e "\n\n \t\t \033[4 ...

  7. 域名解析中TTL是什么意思

    在做域名解析的时候都会看到一个叫“TTL”的值,一般都有一个默认的值,不过不同注册商默认的值也会不一样,常见的是3600和7200这两个值. 另外ping的时候也可以看到“TTL=XXX”的字样,(如 ...

  8. 电影_Z

    1. 西施叨叨叨 西施叨叨叨 2015 第21期 : <<指环王>>系列, <<冰与火之歌>>系列(权力的游戏 将正统史诗奇幻剧搬在电视网上的首部电视剧 ...

  9. 二叉查找树--java

    package com.test.tree; public class BinarySearchTree<T extends Comparable<? super T>> { ...

  10. java常见设计模式

    工厂模式 普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 多个工厂模式,编写多个创建工厂的方法即可. 静态工厂模式,在多个工厂模式的基础上把Factory种方法的返回值标明 ...