您的位置:首页 > 其它

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

2014-10-04 00:05 441 查看

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

Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 45 Solved: 26
[Submit][Status]

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

Silver

题解:
此题<清理牛棚 线段树而已
代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define pa pair<int,int>
#define inf 1000000000
#define ll long long
using namespace std;
inline int read()
{
int x=0;char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x;
}
int n,T,cnt;
bool vis[1000005];
int dis[1000005],last[1000005];
struct data{int to,next,v;}e[2000005];
void insert(int u,int v,int w)
{
e[++cnt].to=v;e[cnt].next=last[u];last[u]=cnt;e[cnt].v=w;
}
void dijkstra()
{
priority_queue<pa,vector<pa>,greater<pa> >q;
for(int i=1;i<=T;i++)dis[i]=inf;
dis[0]=0;q.push(make_pair(0,0));
while(!q.empty())
{
int now=q.top().second;q.pop();
if(vis[now])continue;vis[now]=1;
for(int i=last[now];i;i=e[i].next)
if(dis[now]+e[i].v<dis[e[i].to])
{
dis[e[i].to]=dis[now]+e[i].v;
q.push(make_pair(dis[e[i].to],e[i].to));
}
}
}
int main()
{
n=read();T=read();
for(int i=1;i<=T;i++)
insert(i,i-1,0);
for(int i=1;i<=n;i++)
{
int a=read(),b=read();
insert(a-1,b,1);
}
dijkstra();
if(dis[T]==inf)puts("-1");
else printf("%d\n",dis[T]);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: