[USACO06FEB]摊位预订Stall Reservations

洛咕

POJ

题意:约翰的(N(1<N<50000))头奶牛实在是太难伺候了,她们甚至有自己独特的产奶时段.当然对于某一头奶牛,她每天的产奶时段是固定的,为时间段A到B包括时间段A和时间段B.显然,约翰必须开发一个调控系统来决定每头奶牛应该被安排到哪个牛棚去挤奶,因为奶牛们显然不希望在挤奶时被其它奶牛看见.约翰希望你帮他计算一下:如果要满足奶牛们的要求,并且每天每头奶牛都要被挤过奶,至少需要多少牛棚?每头牛应该在哪个牛棚被挤奶.如果有多种答案,你只需任意一种即可.

分析:按照吃草时间从小到大排序,用一个小根堆维护每个畜栏最后一头牛结束吃草时间,把结束时间最早的牛安排在堆顶,对于新来的一头牛如果它的开始时间比堆顶晚就不用新开牛棚,否则就要新开一个牛棚.

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
inline int read(){
    int x=0,o=1;char ch=getchar();
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')o=-1,ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*o;
}
const int N=50005;
struct node{
	int l,r,id,num;
	bool operator < (const node x) const{
		return r>x.r;
	}
}a[N];
priority_queue<node>q;
inline bool cmp(const node &x,const node &y){return x.l<y.l;}
int ans[N];
int main(){
	int n=read();
	for(int i=1;i<=n;++i){
		a[i].l=read();
		a[i].r=read();
		a[i].id=i;
	}
	sort(a+1,a+n+1,cmp);
	int sum=1;node temp;
	temp.r=a[1].r;temp.num=1;q.push(temp);
	ans[a[1].id]=1;
	for(int i=2;i<=n;++i){
		temp=q.top();
		if(temp.r<a[i].l){
			q.pop();ans[a[i].id]=temp.num;
			node res;res.r=a[i].r;res.num=temp.num;q.push(res);
		}
		else{
			++sum;ans[a[i].id]=sum;
			node cnt;cnt.r=a[i].r;cnt.num=sum;q.push(cnt);
		}
	}
	printf("%d
",sum);
	for(int i=1;i<=n;++i){
		printf("%d
",ans[i]);
	}
    return 0;
}

原文地址:https://www.cnblogs.com/PPXppx/p/11233852.html