BZOJ 3389: [Usaco2004 Dec]Cleaning Shifts安排值班
题目
3389: [Usaco2004 Dec]Cleaning Shifts安排值班
Time Limit: 1 Sec Memory Limit: 128 MB
Description
Input
Output
Sample Input
1 7
3 6
6 10
Sample Output
样例说明
奶牛1和奶牛3参与值班即可.
HINT
Source
题解
呵呵,做了一半忽然发现这不是昨天做的那题(BZOJ 1672)的减弱版,题解直接见http://www.cnblogs.com/WNJXYK/p/4074788.html。线段树动态规划!【听说贪心可做,Orz但那是我N^2贪心TLE了两次、、、
代码
/*Author:WNJXYK*/
#include<cstdio>
#include<algorithm>
using namespace std; int n,st,ed;
struct line{
int left,right;
int w;
}cow[];
bool cmp(line a,line b){
if (a.left<b.left) return true;
if (a.left==b.left && a.right<b.right) return true;
return false;
}
inline int remin(int a,int b){
if (a<b) return a;
return b;
}
inline int remax(int a,int b){
if (a>b) return a;
return b;
} const int Maxn=;
const int Inf=;
struct Btree{
int left,right;
int min;
int tag;
}tree[Maxn*+]; void build(int x,int left,int right){
tree[x].left=left;
tree[x].right=right;
tree[x].tag=Inf;
if (left==right){
tree[x].min=(left<st?:Inf);
}else{
int mid=(left+right)/;
build(x*,left,mid);
build(x*+,mid+,right);
tree[x].min=remin(tree[x*].min,tree[x*+].min);
}
} inline void clean(int x){
if (tree[x].left!=tree[x].right){
tree[x*].min=remin(tree[x].tag,tree[x*].min);
tree[x*].tag=remin(tree[x].tag,tree[x*].tag);
tree[x*+].min=remin(tree[x].tag,tree[x*+].min);
tree[x*+].tag=remin(tree[x].tag,tree[x*+].tag);
tree[x].tag=Inf;
}
} void change(int x,int left,int right,int val){
clean(x);
if (left<=tree[x].left && tree[x].right<=right){
tree[x].tag=remin(tree[x].tag,val);
tree[x].min=remin(tree[x].min,val);
}else{
int mid=(tree[x].left+tree[x].right)/;
if (left<=mid) change(x*,left,right,val);
if (right>=mid+)change(x*+,left,right,val);
tree[x].min=remin(tree[x*].min,tree[x*+].min);
}
} int query(int x,int left,int right){
clean(x);
if (left<=tree[x].left && tree[x].right<=right){
return tree[x].min;
}else{
int Ans=Inf;
int mid=(tree[x].left+tree[x].right)/;
if (left<=mid) Ans=remin(Ans,query(x*,left,right));
if (right>=mid+) Ans=remin(Ans,query(x*+,left,right));
return Ans;
}
} int main(){
scanf("%d%d",&n,&ed);
st=;
build(,,ed);
for (int i=;i<=n;i++){
scanf("%d%d",&cow[i].left,&cow[i].right);
cow[i].w=;
}
sort(cow+,cow+n+,cmp);
for (int i=;i<=n;i++){
int mindist=query(,remax(cow[i].left-,),cow[i].right)+cow[i].w;
//printf("mindist:%d\n",mindist);
//printf("query %d %d -> min=%d\n",remax(cow[i].left-1,0),cow[i].right,query(1,cow[i].left,cow[i].right));
change(,cow[i].left,cow[i].right,mindist);
}
//printf("query min=%d\n",query(1,ed,ed));
int ans=query(,ed,ed);
if (ans==Inf)
printf("-1\n");
else
printf("%d\n",ans);
return ;
}
BZOJ 3389: [Usaco2004 Dec]Cleaning Shifts安排值班的更多相关文章
- Bzoj 3389: [Usaco2004 Dec]Cleaning Shifts安排值班 最短路,神题
3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 218 Solved: ...
- bzoj 3389: [Usaco2004 Dec]Cleaning Shifts安排值班 -- 贪心
3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec Memory Limit: 128 MB Description 一天有 ...
- 3389: [Usaco2004 Dec]Cleaning Shifts安排值班
3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 102 Solved: ...
- 【BZOJ】3389: [Usaco2004 Dec]Cleaning Shifts安排值班(贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=3389 显然左端点排序后,依次取. 要考虑下一次取的方案: 待选点为a[j].x<=a[now] ...
- BZOJ3389: [Usaco2004 Dec]Cleaning Shifts安排值班
3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 45 Solved: ...
- bzoj3389:[Usaco2004 Dec]Cleaning Shifts安排值班
思路:可以贪心,也可以最短路. 贪心写法:因为在保证合法的前提下,我们选择的区间一定要右端点尽量靠后才行,于是我们每次就选择一个合法的并且右端点最靠后的区间就好了(如果没有合法的输出-1即可).时间复 ...
- BZOJ 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚
题目 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec Memory Limit: 64 MB Description Farm ...
- [bzoj3389][Usaco2004Dec]Cleaning Shifts安排值班_最短路
Cleaning Shifts bzoj-3389 Usaco-2004Dec 题目大意:每天有n个时间段,每个时间段都必须安排一个奶牛值班.有m个奶牛,每个奶牛只有一个空闲时间s[i]~e[i],求 ...
- bzoj 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚【dp+线段树】
设f[i]为i时刻最小花费 把牛按l升序排列,每头牛能用f[l[i]-1]+c[i]更新(l[i],r[i])的区间min,所以用线段树维护f,用排完序的每头牛来更新,最后查询E点即可 #includ ...
随机推荐
- js文件中调用另一个js文件:
document.write("<script language='javascript' src='/UEditor/uparse.js'></script") ...
- postman下载和安装
插件下载地址:http://download.csdn.net/download/zhanghaofor/8244137 下载后解压缩,里面有安装方法 1.找到后缀为crx的文件,将后缀改成rar并解 ...
- java面向对象之 类和对象
OOP:Object Oriented Programming(面向对象编程) 面向对象: 1:将复杂的事情简单化. 2:面向对象将以前的过程中的执行者,变成了指挥者. 3:面向对象这种思想是符合现在 ...
- Web存储(Web Storage)介绍
Web存储即在客户端存储数据. 在没有Web Storage之前,是通过cookie来在客户端存储数据的.但是由于 浏览器能存cookie数比较少.如IE8,Firefox,opera每个域可以保存的 ...
- MySQL、You are using safe update mode
MySQL默认模式是sql_safe_updates=1的.在这个模式下不管你是update还是delete一行where 条件都要指定主键.如果where条件只出现的不是主键就会出错. 例子: se ...
- DDR、DDR2、DDR3产品区别
DDR采用一个周期来回传递一次数据,因此传输在同时间加倍,因此就像工作在两倍的工作频率一样.为了直观,以等效的方式命名,因此命名为DDR 200 266 333 400. DDR2尽管工作频率没有变化 ...
- Qt 如何处理密集型耗时的事情(频繁调用QApplication::processEvents)
有时候需要处理一些跟界面无关的但非常耗时的事情,这些事情跟界面在同一个线程中,由于时间太长,导致界面无法响应,处于“假死”状态.例如:在应用程序中保存文件到硬盘上,从开始保存直到文件保存完毕,程序不响 ...
- HDU 5782 Cycle(KMP+Hash)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5782 [题目大意] 给出两个字符串,判断他们每一个前缀是否循环同构,循环同构的意思就是,字符串首位 ...
- Fastboot的使用简单教程
大家都知道HTC手机重新启动进入所谓的project模式,就是HBOOT,然后能够进入FASTBOOT界面,在这个界面.我们能够在电脑端能够做非常多事,特别是HBOOT被改动过,假设是ENG S-OF ...
- C# 对象拷贝问题 =等同于浅拷贝
大家都知道,在C#中变量的存储分为值类型和引用类型两种,而值类型和引用类型在数值变化是产生的后果是不一样的,值类型我们可以轻松实现数值的拷贝,那么引用类型呢,在对象拷贝上存在着一定的难度. 下 ...