题目

3389: [Usaco2004 Dec]Cleaning Shifts安排值班

Time Limit: 1 Sec  Memory Limit: 128 MB

Description

    一天有T(1≤T≤10^6)个时段.约翰正打算安排他的N(1≤N≤25000)只奶牛来值班,打扫
打扫牛棚卫生.每只奶牛都有自己的空闲时间段[Si,Ei](1≤Si≤Ei≤T),只能把空闲的奶牛安排出来值班.而且,每个时间段必需有奶牛在值班.  那么,最少需要动用多少奶牛参与值班呢?如果没有办法安排出合理的方案,就输出-1.

Input

 
    第1行:N,T.
    第2到N+1行:Si,Ei.

Output

 
    最少安排的奶牛数.

Sample Input

3 10
1 7
3 6
6 10

Sample Output

2

样例说明
奶牛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安排值班的更多相关文章

  1. Bzoj 3389: [Usaco2004 Dec]Cleaning Shifts安排值班 最短路,神题

    3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 218  Solved: ...

  2. bzoj 3389: [Usaco2004 Dec]Cleaning Shifts安排值班 -- 贪心

    3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MB Description     一天有 ...

  3. 3389: [Usaco2004 Dec]Cleaning Shifts安排值班

    3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 102  Solved: ...

  4. 【BZOJ】3389: [Usaco2004 Dec]Cleaning Shifts安排值班(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3389 显然左端点排序后,依次取. 要考虑下一次取的方案: 待选点为a[j].x<=a[now] ...

  5. BZOJ3389: [Usaco2004 Dec]Cleaning Shifts安排值班

    3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 45  Solved:  ...

  6. bzoj3389:[Usaco2004 Dec]Cleaning Shifts安排值班

    思路:可以贪心,也可以最短路. 贪心写法:因为在保证合法的前提下,我们选择的区间一定要右端点尽量靠后才行,于是我们每次就选择一个合法的并且右端点最靠后的区间就好了(如果没有合法的输出-1即可).时间复 ...

  7. BZOJ 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚

    题目 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farm ...

  8. [bzoj3389][Usaco2004Dec]Cleaning Shifts安排值班_最短路

    Cleaning Shifts bzoj-3389 Usaco-2004Dec 题目大意:每天有n个时间段,每个时间段都必须安排一个奶牛值班.有m个奶牛,每个奶牛只有一个空闲时间s[i]~e[i],求 ...

  9. 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 ...

随机推荐

  1. 软件开发常用Linux命令

    解压缩 tar -zxvf xxx.tar.gz 文件显示及查找常用于分析log //显示file中包含aaa的行 cat <file>|grep aaa 查看cpu memory基本信息 ...

  2. lab4 Cache Geometries 深入理解计算机系统——高速缓存

    这个实验主要是将高速缓存命中的一点东西,意在告诉我们平常多注意这方面的东西. 不懂java的,所以只管C的部分. You will do this several times, making smal ...

  3. TCP的流量控制

    TCP协议作为一个可靠的面向字节流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现. 要区分TCP的流量控制和拥塞控制: 流量控制是发送方的发送数据的速 ...

  4. 一句代码美化你的下框之jquery.selectMM修复版(jquery.selectMM v0.9 beta 20141217)

    一句代码美化你的下框之jquery.selectMM修复版(jquery.selectMM v0.9 beta 20141217) 浏览效果: http://www.beyond630.com/jqu ...

  5. jQuery实现导航监听事件

    导航html如下 <div class="main_nav"> <a class="nav_01 active_01" href=" ...

  6. [暂停一天]从零开始PHP学习 - 第六天

    今天这个系列没有时间去写了 在公司完善一个项目     已经备好6瓶咖啡 两天 + 一夜 完成这个项目  真是苦逼 诶 反正这几天 明白一个道理:别以为你多牛B 你不会的东西多了!  比你牛B的人也多 ...

  7. Android SharedPreference最佳实践

    Android提供多种方式保存应用数据,其中一种方式是SharedPreferences,使用键值对保存私有基本的数据.所有的逻辑仅基于以下三个类: SharedPreferences SharedP ...

  8. CCNA实验(7) -- NAT

    1.静态NAT2.动态NAT3.复用内部全局地址的NAT(PAT) enableconf tno ip do loenable pass ciscoline con 0logg syncexec-t ...

  9. 类型萃取(type traits)

    1. 类型萃取的作用 类型萃取使用模板技术来萃取类型(包含自定义类型和内置类型)的某些特性,用以判断该类型是否含有某些特性,从而在泛型算法中来对该类型进行特殊的处理用来提高效率或者其他.例如:在STL ...

  10. InnoDB引擎Myslq数据库数据恢复

    首先祝愿看到这片文章的你永远不要有机会用到它... 本文指针对用InnoDB引擎的Mysql数据库的数据恢复,如果是其它引擎的Mysql或其它数据库请自行google... 如果有一天你手挫不小心删掉 ...