【POJ3171】Cleaning Shifts 带权区间最小覆盖
题目大意:给定一个长度为 N 的序列,求带权区间最小覆盖。
题解:设 \(dp[i]\) 表示从左端点到 i 的最小权值是多少,则状态转移为:\(dp[e[i].ed]=min\{dp[j],j\in[e[i].st-1,e[i].ed-1] \}\),初始化 \(dp[st-1]=0\) 即可。因此,这里用线段树来维护区间最小值即可。不过这道题需要注意的点有很多,首先开始区间的下标从 0 开始,因此需要注意避免下标为负数的情况,我采用了所有坐标加 1 的写法,结尾要注意所给区间排序之后末尾可能出现大于给定的结尾的情况,线段树需要维护两者较大的值。其次是状态转移时,线段树中的 modify 函数并不是直接修改值,而是需要比较一下大小再决定是否修改。(在这里WA了好长时间QAQ)
代码如下
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=1e5;
const int inf=0x3f3f3f3f;
inline int read(){
int x=0,f=1;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
return f*x;
}
struct node{
#define ls t[k].lc
#define rs t[k].rc
int lc,rc,mi;
}t[maxn<<1];
int tot=1;
int n,st,ed,ans,dp[maxn],l_b,r_b;
struct seg{
int st,ed,w;
bool operator<(const seg& y)const{return this->ed<y.ed;}
}e[10010];
inline void pushup(int k){t[k].mi=min(t[ls].mi,t[rs].mi);}
void build(int k,int l,int r){
if(l==r){t[k].mi=dp[l];return;}
int mid=l+r>>1;
ls=++tot,build(ls,l,mid);
rs=++tot,build(rs,mid+1,r);
pushup(k);
}
void modify(int k,int l,int r,int pos,int val){
if(l==r){t[k].mi=min(t[k].mi,val);return;}
int mid=l+r>>1;
if(pos<=mid)modify(ls,l,mid,pos,val);
else modify(rs,mid+1,r,pos,val);
pushup(k);
}
int query(int k,int l,int r,int x,int y){
if(l==x&&r==y)return t[k].mi;
int mid=l+r>>1;
if(y<=mid)return query(ls,l,mid,x,y);
else if(x>mid)return query(rs,mid+1,r,x,y);
else return min(query(ls,l,mid,x,mid),query(rs,mid+1,r,mid+1,y));
}
void read_and_parse(){
memset(dp,0x3f,sizeof(dp));
n=read(),st=read()+1,ed=read()+1;//偏移量
for(int i=1;i<=n;i++){
scanf("%d%d%d",&e[i].st,&e[i].ed,&e[i].w);
++e[i].st,++e[i].ed;
}
sort(e+1,e+n+1);
r_b=max(ed,e[n].ed),l_b=st-1;
dp[st-1]=0;
build(1,l_b,r_b);
}
void solve(){
for(int i=1;i<=n;i++){
int mi=query(1,l_b,r_b,e[i].st-1,e[i].ed-1);
if(mi==inf)continue;
dp[e[i].ed]=mi+e[i].w;
modify(1,l_b,r_b,e[i].ed,dp[e[i].ed]);
}
ans=inf;
for(int i=ed;i<=r_b;i++)ans=min(ans,dp[i]);
if(ans==inf)puts("-1");
else printf("%d\n",ans);
}
int main(){
read_and_parse();
solve();
return 0;
}
【POJ3171】Cleaning Shifts 带权区间最小覆盖的更多相关文章
- POJ3171 Cleaning Shifts DP,区间覆盖最值
题目大意.N个区间覆盖[T1,T2]及相应的代价S,求从区间M到E的所有覆盖的最小代价是多少. (1 <= N <= 10,000).(0 <= M <= E <= 86 ...
- BZOJ2298: [HAOI2011]problem a(带权区间覆盖DP)
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1747 Solved: 876[Submit][Status][Discuss] Descripti ...
- 洛谷P2439 [SDOI2005]阶梯教室设备利用(带权区间覆盖)
题目背景 我们现有许多演讲要在阶梯教室中举行.每一个演讲都可以用唯一的起始和终止时间来确定,如果两个演讲时间有部分或全部重复,那么它们是无法同时在阶级教室中举行的.现在我们想要尽最大可能的利用这个教室 ...
- poj3171 Cleaning Shifts【线段树(单点修改区间查询)】【DP】
Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4422 Accepted: 1482 D ...
- poj3171 Cleaning Shifts[DP]
https://vjudge.net/problem/POJ-3171.(有价值的区间全覆盖问题) (lyd例题)朴素DP很好想,$f[i]$表示将右端点从小到大排序后从$L$(要求覆盖的大区间)到第 ...
- [USACO2005][POJ3171]Cleaning Shifts(DP+线段树优化)
题目:http://poj.org/problem?id=3171 题意:给你n个区间[a,b],每个区间都有一个费用c,要你用最小的费用覆盖区间[M,E] 分析:经典的区间覆盖问题,百度可以搜到这个 ...
- POJ 2376 Cleaning Shifts (贪心,区间覆盖)
题意:给定1-m的区间,然后给定n个小区间,用最少的小区间去覆盖1-m的区间,覆盖不了,输出-1. 析:一看就知道是贪心算法的区间覆盖,主要贪心策略是把左端点排序,如果左端点大于1无解,然后, 忽略小 ...
- poj3171 Cleaning Shifts
传送门 题目大意 有一个大区间和n个小区间,每个小区间都有一个代价,求最少付出多少代价可以使得小区间完全覆盖大区间. 分析为了方便起见我们先将s变为2,其它的位置都对应更改以便后期处理.我们考虑以t1 ...
- POJ2376 Cleaning Shifts
题意 POJ2376 Cleaning Shifts 0x50「动态规划」例题 http://bailian.openjudge.cn/practice/2376 总时间限制: 1000ms 内存限制 ...
随机推荐
- 20155217《网络对抗》Exp03 免杀原理与实践
20155217<网络对抗>Exp03 免杀原理与实践 实践内容 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程 ...
- Python基础(字符串和编码)
字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特 ...
- 变量内存空间的释放---c语言
堆栈内存释放: 栈的内存是由编译器自动分配.释放,出了作用域就释放. 堆的内存由程序员分配.释放,他的作用域是整个程序,如果程序没有释放,程序结束时会自动释放.
- sudo apt-get update 去除设置的代理
今天想装个软件(wine),使用 sudo apt-get update 命令时,发现给出很多Ign 语句,总出现 Connecting to proxy.http://10.0.126.1:1312 ...
- 一款基于Zigbee技术的智慧鱼塘系统研究与设计
在现代鱼塘养鱼中,主要困扰渔农的就是养殖成本问题.而鱼塘养殖成本最高的就是养殖的人工费,喂养的饲料费和鱼塘中高达几千瓦增氧机的消耗的电费.实现鱼塘自动化养殖将会很好地解决上述问题,大大提高渔农的经济效 ...
- 《杜增强讲Unity之Tanks坦克大战》9-发射子弹时蓄力
9 发射子弹时蓄力 实现效果如下 image 按下开火键(坦克1为空格键)重置力为最小力,一直按着的时候蓄力,抬起的时候发射.如果按着的时候蓄力到最大,则自动发射,此时在抬起则不会重复发射. 首先 ...
- [转载] JVM 内存结构
转载自:http://gityuan.com/2015/10/17/java-memory/
- 广州区块链系统or积分联盟
区块链技术开发至今已有十年,从概念的现世到如今初步应用,区块链开发公司在各个领域开始发光发热,很多人都想参与其中,通过区块链开发实现企业转型来适应未来市场,也有一些初创者希望借此实现创业意图,但在诸多 ...
- Alpha版本测试
Alpha版本测试报告 项目名称:面向团队的日程提醒系统 软件版本:1.0.0 开发方:Team c# 开发代表:崔强 杜正远 是否经过开发自测(单元测试):是 软件运行环境: Android4.4. ...
- 《LINUX内核设计与实现》第一、二章学习总结
第一章 Linux内核简介 (一)Unix是一个强大.健壮和稳定的操作系统,特点是: Unix很简洁,仅仅提供几个几百个系统调用并且有一个非常明确的设计目的 在Unix中,所有的东西都被当作文件对待, ...