P4644 [Usaco2005 Dec]Cleaning Shifts 清理牛棚
P4644 [Usaco2005 Dec]Cleaning Shifts 清理牛棚
你有一段区间需要被覆盖(长度 <= 86,399)
现有 \(n \leq 10000\) 段小线段, 每段可以从 \(l_{i}\) 到 \(r_{i}\) 花费为 \(s_{i}\)
求覆盖整个区间的最小花费
错误日志: 初始化时应该是 \(dp[L - 1]\) 为 \(0\) 而不是 \(dp[1]\) 为 \(0\) , 因为只需要覆盖 \([L, R]\)
Solution
设 \(dp[n]\) 表示从起点覆盖到 \(n\) 的最小花费
我们将小线段按照右端点升序排序, 满足无后效性
对于第 \(i\) 个线段, 有状态转移方程:$$dp[r_{i}] = min(dp[r_{i}], \min_{l_[i] - 1 \leq k < r_{i}}dp[k] + s_{i})$$
其含义为: 从第 \(i\) 段线段的起点开始选择上一个终点的最小值, 这样可以使线段相交(来保证无空白), 更新此线段能覆盖的终点
然后发现我们需要区间查询最小值和单点修改
为啥是单点修改不是区间修改呢? 当两个线段相交, 一定有 \(l_{x} \leq r_{y}\)
所以只需要在线段终点处单点修改即可
初始化 \(dp[L - 1]\) 为零
因为需要线段树维护, 尽量把起点设为 \(1\) 防止各种奇怪的错误, 本题所有位置点坐标 $ + 2$
还要注意处理一下超出 \([L, R]\) 的线段
Code
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
#define LL long long
#define REP(i, x, y) for(int i = (x);i <= (y);i++)
using namespace std;
int RD(){
int out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const int minn = 166419, INF = 1e9;
int num, L, R;
struct Node{
int l, r, s;
}I[minn];
bool cmp(Node a, Node b){return a.r < b.r;}
#define lid (id << 1)
#define rid (id << 1) | 1
int dp[minn];
struct seg_tree{
int l, r;
int min;
}tree[minn << 2];
void pushup(int id){tree[id].min = min(tree[lid].min, tree[rid].min);}
void build(int id, int l, int r){
tree[id].l = l, tree[id].r = r;
if(l == r){
tree[id].min = dp[l];
return ;
}
int mid = (l + r) >> 1;
build(lid, l, mid), build(rid, mid + 1, r);
pushup(id);
}
void update(int id, int val, int l, int r){
if(tree[id].l == l && tree[id].r == r){
tree[id].min = val;
return ;
}
int mid = (tree[id].l + tree[id].r) >> 1;
if(mid < l)update(rid, val, l, r);
else update(lid, val, l, r);
pushup(id);
}
int query(int id, int l, int r){
if(tree[id].l == l && tree[id].r == r)return tree[id].min;
int mid = (tree[id].l + tree[id].r) >> 1;
if(mid < l)return query(rid, l, r);
else if(mid >= r)return query(lid, l, r);
else return min(query(lid, l, mid), query(rid, mid + 1, r));
}
int main(){
num = RD(), L = RD() + 2, R = RD() + 2;//保证线段树左端点是1
REP(i, 1, R)dp[i] = INF;
dp[L - 1] = 0;
build(1, 1, R);
REP(i, 1, num){
I[i].l = RD() + 2;
I[i].r = RD() + 2;
I[i].s = RD();
I[i].l = I[i].l < L ? L : I[i].l;//处理一下超出范围的
I[i].r = I[i].r > R ? R : I[i].r;
}
sort(I + 1, I + 1 + num, cmp);
REP(i, 1, num){
int minn = query(1, I[i].l - 1, I[i].r);
//printf("minn=%d\n", minn);
dp[I[i].r] = min(dp[I[i].r], minn + I[i].s);
update(1, dp[I[i].r], I[i].r, I[i].r);
}
//REP(i, L - 1, R)printf("dp[%d]=%d\n", i - 2, dp[i]);
if(dp[R] == INF){puts("-1");return 0;}
printf("%d\n", dp[R]);
return 0;
}
P4644 [Usaco2005 Dec]Cleaning Shifts 清理牛棚的更多相关文章
- 洛谷P4644 [USACO2005 Dec]Cleaning Shifts 清理牛棚 [DP,数据结构优化]
题目传送门 清理牛棚 题目描述 Farmer John's cows, pampered since birth, have reached new heights of fastidiousness ...
- BZOJ1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚
1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 414 Solved: ...
- BZOJ 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚
题目 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec Memory Limit: 64 MB Description Farm ...
- BZOJ_1672_[Usaco2005 Dec]Cleaning Shifts 清理牛棚_动态规划+线段树
BZOJ_1672_[Usaco2005 Dec]Cleaning Shifts 清理牛棚_动态规划+线段树 题意: 约翰的奶牛们从小娇生惯养,她们无法容忍牛棚里的任何脏东西.约翰发现,如果要使这群 ...
- [Usaco2005 Dec]Cleaning Shifts 清理牛棚 (DP优化/线段树)
[Usaco2005 Dec] Cleaning Shifts 清理牛棚 题目描述 Farmer John's cows, pampered since birth, have reached new ...
- 【BZOJ1672】[Usaco2005 Dec]Cleaning Shifts 清理牛棚 动态规划
[BZOJ1672][Usaco2005 Dec]Cleaning Shifts Description Farmer John's cows, pampered since birth, have ...
- 【bzoj1672】[USACO2005 Dec]Cleaning Shifts 清理牛棚
题目描述 Farmer John's cows, pampered since birth, have reached new heights of fastidiousness. They now ...
- 【BZOJ】1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚(dp/线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1672 dp很好想,但是是n^2的..但是可以水过..(5s啊..) 按左端点排序后 f[i]表示取第 ...
- 【bzoj1672】[USACO2005 Dec]Cleaning Shifts 清理牛棚 dp/线段树
题目描述 Farmer John's cows, pampered since birth, have reached new heights of fastidiousness. They now ...
随机推荐
- 互评beta版本 - 探路者【贪吃蛇】
基于NABCD评论,及改进建议 1)N(Need 需求) 开发本软件一方面是为了让80,90后用户重温童年的美好记忆,另一方面也是为了增加对英语学习兴趣较弱.意志力薄弱的中小学生学习英语的兴趣和动力, ...
- 构造一个简单的Linux内核的MenuOS
构造一个简单的Linux内核的MenuOS 20135109 高艺桐 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000 ...
- 团队冲刺——Four
今日计划: 司宇航:网页生成桌面图标.如何将web项目上线部署到公网.测试与优化其他功能. 季方 :处理爬虫获取的数据. 马佳慧:研究css模板. 王金萱:登录注册界面. 遇到的问题:季方:爬虫获取的 ...
- centos6 安装图形化界面
1.首先进行光盘的挂载,注意光盘挂载时不会自动建立目录的,所以需要自己建立目录 mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom #dev目录为设备目录 2.更 ...
- python处理xml实例
""" Author = zyh FileName = read_xml_1.py Time = 18-9-26 下午5:19 """ fr ...
- B2
组员1:吴晓晖(组长) 过去两天完成了哪些任务 代码重构基本完成 展示GitHub当日代码/文档签入记录 接下来的计划 推荐算法 还剩下哪些任务 组员2:陈锦谋 过去两天完成了哪些任务 重新制作图标 ...
- BNUOJ 52317 As Easy As Possible 树上倍增/主席树
题目链接: https://acm.bnu.edu.cn/v3/problem_show.php?pid=52317 As Easy As Possible Case Time Limit: 1000 ...
- Alpha版本冲刺(四)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:何家伟 组员8:政演 组员9:鸿杰 组员10:刘一好 组员:何宇恒 展示组内最新 ...
- js & click copy to clipboard
js & click copy to clipboard https://www.cnblogs.com/xgqfrms/p/9999061.html https://www.cnblogs. ...
- Convolutional Neural Networks卷积神经网络(二)
转自http://blog.csdn.net/zouxy09/article/details/8781543 CNNs是第一个真正成功训练多层网络结构的学习算法.它利用空间关系减少需要学习的参数数目以 ...