[bzoj3389][Usaco2004Dec]Cleaning Shifts安排值班_最短路
Cleaning Shifts bzoj-3389 Usaco-2004Dec
题目大意:每天有n个时间段,每个时间段都必须安排一个奶牛值班。有m个奶牛,每个奶牛只有一个空闲时间s[i]~e[i],求至少动用多少奶牛。
注释:$1\le n\le 10^6$,$1\le m\le 25,000$。
想法:神题
我们将所有的时间点排成一排,然后对每一个i+1向i连一条无代价的边。
对于每一个s[i]向其对应的e[i]连边,代价为1.
然后求1到n的最短路即可
这样建图的道理:首先,从后面的时间点向前面的时间点连边是没有任何问题的。这就相当于我已经管理到了x时间段,我雇佣一个开始于x之前的奶牛,显然是可行且无代价的。
那么从s[i]向e[i]连边,就是说我雇佣这头奶牛,此时我已经管理到了e[i]这个时间点。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define M 1000010
#define N 30010
using namespace std;
int dis[M];
bool v[M];
struct cmp
{
bool operator()(int x,int y)
{
return dis[x]>dis[y];
}
};
priority_queue<int,vector<int>,cmp>q;
int head[M],to[N+M],nxt[N+M],val[N+M],tot;
inline void add(int x,int y,int z)
{
to[++tot]=y;
val[tot]=z;
nxt[tot]=head[x];
head[x]=tot;
}
inline void original()
{
memset(dis,0x3f,sizeof dis);
}
int main()
{
int n,m;
cin >> n >> m ;
for(int i=1;i<=m;i++) add(i,i-1,0);
original();
for(int x,y,i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
add(x-1,y,1);
}
dis[0]=0;
q.push(0);
while(!q.empty())
{
int x=q.top();q.pop();
if(v[x]) continue;
for(int i=head[x];i;i=nxt[i])
{
if(v[to[i]]) continue;
if(dis[to[i]]>dis[x]+val[i])
{
dis[to[i]]=dis[x]+val[i];
q.push(to[i]);
}
}
}
if(dis[m]==0x3f3f3f3f) printf("-1\n");
else printf("%d\n",dis[m]);
return 0;
}
小结:好题,感觉自己图论菜的一匹... ...
[bzoj3389][Usaco2004Dec]Cleaning Shifts安排值班_最短路的更多相关文章
- BZOJ3389: [Usaco2004 Dec]Cleaning Shifts安排值班
3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 45 Solved: ...
- 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安排值班 -- 贪心
3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec Memory Limit: 128 MB Description 一天有 ...
- bzoj3389:[Usaco2004 Dec]Cleaning Shifts安排值班
思路:可以贪心,也可以最短路. 贪心写法:因为在保证合法的前提下,我们选择的区间一定要右端点尽量靠后才行,于是我们每次就选择一个合法的并且右端点最靠后的区间就好了(如果没有合法的输出-1即可).时间复 ...
- 【BZOJ】3389: [Usaco2004 Dec]Cleaning Shifts安排值班(贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=3389 显然左端点排序后,依次取. 要考虑下一次取的方案: 待选点为a[j].x<=a[now] ...
- BZOJ_1672_[Usaco2005 Dec]Cleaning Shifts 清理牛棚_动态规划+线段树
BZOJ_1672_[Usaco2005 Dec]Cleaning Shifts 清理牛棚_动态规划+线段树 题意: 约翰的奶牛们从小娇生惯养,她们无法容忍牛棚里的任何脏东西.约翰发现,如果要使这群 ...
- poj 2376 Cleaning Shifts 最小区间覆盖
Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 40751 Accepted: 9871 ...
随机推荐
- 我在Suse 11 Sp3上使用anaconda安装TensorFlow的过程记录
我在Suse 11 Sp3上使用anaconda安装TensorFlow的过程记录 准备安装包: gcc48 glibc--SP4-DVD-x86_64-GM-DVD1.iso tensorflow_ ...
- 套接字(socket)与socket 编程
字节序: 主机字节序(host byte order):不同的主机有不同的字节序,x86:小端: 网络字节序(network byte order):大端字节序: 0. 什么是套接字 套接字是网络进程 ...
- WPF:通过Window.DataContext实现窗口间传值
通过Window.DataContext实现窗口之间的传值,特别是跨窗口控件的联动,具有无可比拟的优势.实现方法如下: 1. MainWindow.xaml,在Window.DataContext中 ...
- Python 39 数据库的数据类型
一:整型 为什么需要 数据分类? 1.为了描述事物更加准确 2.描述起来更方便 3.节省内存空间 例:1 a 你 utf8 下 5个字节 1 a b c unicode 6个字节 mysq ...
- mybatis的二级缓存
在mybatis主配置文件里configuration标签里添加 <settings> <setting name="cacheEnabled" value=&q ...
- bcg库使用心得两则
作者:朱金灿 来源:http://blog.csdn.net/clever101 最近帮同事解决了两个BCG库的使用问题,特记录下来. 一是在outlook风格停靠栏上创建对话框的做法.代码如下: C ...
- 关于MYSQL 存储过程的文章摘录
1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储 ...
- WEB笔记-2 剖析CSS规则
2.1 剖析CSS规则 规则即指令,其声明了需要修改的元素及要应用给元素的样式. 2.2 为文档添加样式的三种方法 行内样式:直接写在HTML文档标签中的style属性当中,行内元素只 ...
- Oracle数据库的导入和导出
Oracle数据库的导入和导出,是一项重要的的技术活,不但解决了数据库的导入导出,更方便快捷的获得数据. 使用imp和exp导入导出数据 使用exp导出数据 存放目录为\ORACLE_HOME\BIN ...
- 读书笔记「Python编程:从入门到实践」_4.操作列表
4.1 遍历整个列表 4.1.1 深入地研究循环 4.1.2 在for循环中执行更多的操作 4.1.3 在for循环结束后执行一些操作 例 magicians = ['alice', ' ...