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 ...
随机推荐
- Archlinux 安装配置指导 2015-05-24
因为用的Linode VPS的系统是Archlinux的,想在本地弄个系统做测试用,这样比较方便.然后发现自己在6年前做的一个Archlinux 安装配置Flash,好怀念的赶脚. 时过进迁,没想到A ...
- notepad++ 必装插件
nppftp ;FTP客户端,你懂的: explorer:设置常用文件链接:打开当前文件路径:
- python定制类(以Fib类为例)
class Fib(object): def __init__(self): self.a, self.b = 0, 1 def __iter__(self): return self def __n ...
- SQL1-(增删改查、常用函数)
USE flowershopdb --全球唯一标识符(GUID UUID) SELECT NEWID() --增删改查 --INSERT [INTO] <表名> [列名] VALUES & ...
- codeforces 632D. Longest Subsequence 筛法
题目链接 记录小于等于m的数出现的次数, 然后从后往前筛, 具体看代码. #include <iostream> #include <vector> #include < ...
- 解决magento保存产品时耗时很长的问题
以前我在更新产品属性值(拿price为例)的时候,通常会这样做: foreach($product_ids as $id){ $product = Mage::getModel('catalog/pr ...
- Dialog with HTML skin using CDHtmlDialog and SetWindowRgn
Introduction This program demonstrates how to use CDHtmlDialog and SetWindowRgn functions to give a ...
- hdoj 2546 饭卡(0-1背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546 思路分析:该问题为0-1背包问题的变形题:问题求余额最少,设开始的余额为V,则求得用V-5可以买 ...
- wndows make images
配置文件/etc/xen/mywindows.内容如下 import os, re arch_libdir = 'lib' arch = os.uname()[4] if os.uname()[0] ...
- mirantis cert
with no vendor specificity and/or proprietary implementations,没有供应商的特异性和/或专有的实现 https://training.mir ...