Stall Reservations
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 5390 | Accepted: 1945 | 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:
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
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.
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.
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:
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.
Source
题意:每头牛独享一个牛栏里的[A, B],问最少需要几个牛栏。
思路:优先选A最小的,维持一个牛栏B最小堆,将新来的奶牛塞进B最小的牛栏里。
代码:
#include<iostream>
#include<queue>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 50005;
struct node
{
int x, y, id;
bool operator <(const node a) const
{
return y > a.y;
}
}a[maxn];
int ans[maxn];
bool cmp(node a, node b)
{
if(a.x == b.x) return a.y < b.y;
else return a.x < b.x;
}
int main(void)
{
int n;
while(~scanf("%d", &n))
{
int k = 1;
priority_queue<node> pq;
for(int i = 0; i < n; i++)
{
scanf("%d%d", &a[i].x, &a[i].y);
a[i].id = i;
}
sort(a, a+n, cmp);
pq.push(a[0]);
ans[a[0].id] = k++;
for(int i = 1; i < n; i++)
{
node t = pq.top();
if(t.y < a[i].x)
{
ans[a[i].id] = ans[t.id];
pq.pop();
pq.push(a[i]);
}
else
{
ans[a[i].id] = k++;
pq.push(a[i]);
}
}
printf("%d\n", k-1);
for(int i = 0; i < n; i++)
printf("%d\n", ans[i]);
}
return 0;
}