Stall Reservations
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 3660 Accepted: 1313 Special Judge
Description
Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will only be milked over some precise time interval A..B (1 <= A <= B <= 1,000,000), which includes both times A and B. Obviously, FJ must create a reservation system to determine which stall each cow can be assigned for her milking time. Of course, no cow will share such a private moment with other cows.
Help FJ by determining:
The minimum number of stalls required in the barn so that each cow can have her private milking period
An assignment of cows to these stalls over time
Many answers are correct for each test dataset; a program will grade your answer.
Input
Line 1: A single integer, N
Lines 2..N+1: Line i+1 describes cow i's milking interval with two space-separated integers.
Output
Line 1: The minimum number of stalls the barn must have.
Lines 2..N+1: Line i+1 describes the stall to which cow i will be assigned for her milking period.
Sample Input
5
1 10
2 4
3 6
5 8
4 7
Sample Output
4
1
2
3
2
4
Hint
Explanation of the sample:
Here's a graphical schedule for this output:
Time 1 2 3 4 5 6 7 8 9 10
Stall 1 c1>>>>>>>>>>>>>>>>>>>>>>>>>>>
Stall 2 .. c2>>>>>> c4>>>>>>>>> .. ..
Stall 3 .. .. c3>>>>>>>>> .. .. .. ..
Stall 4 .. .. .. c5>>>>>>>>> .. .. ..
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 3660 Accepted: 1313 Special Judge
Description
Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will only be milked over some precise time interval A..B (1 <= A <= B <= 1,000,000), which includes both times A and B. Obviously, FJ must create a reservation system to determine which stall each cow can be assigned for her milking time. Of course, no cow will share such a private moment with other cows.
Help FJ by determining:
The minimum number of stalls required in the barn so that each cow can have her private milking period
An assignment of cows to these stalls over time
Many answers are correct for each test dataset; a program will grade your answer.
Input
Line 1: A single integer, N
Lines 2..N+1: Line i+1 describes cow i's milking interval with two space-separated integers.
Output
Line 1: The minimum number of stalls the barn must have.
Lines 2..N+1: Line i+1 describes the stall to which cow i will be assigned for her milking period.
Sample Input
5
1 10
2 4
3 6
5 8
4 7
Sample Output
4
1
2
3
2
4
Hint
Explanation of the sample:
Here's a graphical schedule for this output:
Time 1 2 3 4 5 6 7 8 9 10
Stall 1 c1>>>>>>>>>>>>>>>>>>>>>>>>>>>
Stall 2 .. c2>>>>>> c4>>>>>>>>> .. ..
Stall 3 .. .. c3>>>>>>>>> .. .. .. ..
Stall 4 .. .. .. c5>>>>>>>>> .. .. ..
Other outputs using the same number of stalls are possible.
这道题跟那次市赛的题超时的原因是一样的,数据量是50000,如果不加优化,两个循环就容易超时,于是乎用优化,学到了一个新的stl的用法:
优先队列里边存的是一个结构体的情况,一般情况下,只做过队列里边存的是一个数的情况,这样队列里先出的只能是一个数,没有混淆的其他数,但是存结构体就不行了,结构体里边存了多组数据,这样一来内存就出现了错误。查阅了资料之后发现,结构体是一种类,可以在结构体里定义存入队列当中,是怎么样的(应该按照怎么样的顺序出队列),相关代码如下:
struct node
{
int start;
int last;
int late;
int line;
bool operator()(const node& a, const node& b)
{
return a.last > b.last;
}
}row[50010];
然后再定义一个结构体类型的队列就可实现按照结束时间来先出了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
struct node
{
int start;
int last;
int late;
int line;
bool operator()(const node& a, const node& b)
{
return a.last > b.last;
}
}row[50010];
bool cmp(struct node a,struct node b)
{
if(a.start!=b.start)
return a.start<b.start;
return a.last<b.last;
}
bool cmq(struct node a,struct node b)
{
return a.late<b.late;
}
int main(void)
{
//freopen("A.txt","r",stdin);
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int s,l;
scanf("%d%d",&s,&l);
row[i].start=s;
row[i].last=l;
row[i].late=i;
}
sort(row+1,row+n+1,cmp);
// rows[1].start=row[1].start;
// rows[1].last=row[1].last;
// rows[1].late=1;
row[1].line=1;
priority_queue<struct node, vector<struct node>, struct node> p;
p.push(row[1]);
int k=1;
for(int i=2;i<=n;i++)
{
// printf("%d\n",i);
if(row[i].start>p.top().last)
{
row[i].line=p.top().line;
p.pop();
p.push(row[i]);
}
else
{
k++;
row[i].line=k;
p.push(row[i]);
}
}
sort(row+1,row+n+1,cmq);
printf("%d\n",p.size());
for(int i=1;i<=n;i++)
printf("%d\n",row[i].line);
return 0;
}