我感觉我该去看紫书研究研究STL了,不知道的东西太多了,不会优先队列的话应该是做不了这个题吧,因为既在按开始时间排序之后判断每个cow是否需要新的stall或者说需要用哪个stall的时候需要找之前的cow中B最早的,自己找的话貌似只能用复杂度很高的方法吧,而优先队列插入数据的复杂度为O(lgn),删除数据的复杂度为O(1),这里n的最大值即stall的最大数,而stall的最大值也不会超过N,所以这个算法的复杂度应为O(N*lgN)。
此题是贪心加优先队列,具体看代码吧。
include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int MAX_N = 50005;
struct cow {
int num, A, B, stall;
friend bool operator <(cow b, cow c)
{
return b.B>c.B;
}
} a[MAX_N];
int N, stall;
bool cmp(cow b, cow c){
return b.A < c.A;
}
void ini()
{
for(int i=0; i<N; i++){
a[i].num = i;
scanf("%d%d", &a[i].A, &a[i].B);
}
stall = 1;
}
void assign()
{
priority_queue<cow> que;
a[0].stall = 1;
que.push(a[0]);
for(int i=1; i<N; i++){
cow temp = que.top();
if(a[i].A > temp.B){
que.pop();
a[i].stall = temp.stall;
}
else a[i].stall = ++stall;
que.push(a[i]);
}
}
void print()
{
printf("%d\n", stall);
int b[MAX_N];
for(int i=0; i<N; i++){
b[a[i].num] = a[i].stall;
}
for(int i =0; i<N; i++){
printf("%d\n", b[i]);
}
}
int main()
{
while(~scanf("%d", &N)){
ini();
sort(a, a+N, cmp);
assign();
print();
}
return 0;
}