1. 程式人生 > >攤位預訂Stall Reservations

攤位預訂Stall Reservations

題目描述

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 periodAn assignment of cows to these stalls over timeMany answers are correct for each test dataset; a program will grade your answer.

約翰的N(l < N < 50000)頭奶牛實在是太難伺候了,她們甚至有自己獨特的產奶時段.當 然對於某一頭奶牛,她每天的產奶時段是固定的,為時間段A到B包括時間段A和時間段B.顯然,約翰必須開發一個調控系統來決定每頭奶牛應該被安排到哪個牛棚去擠 奶,因為奶牛們顯然不希望在擠奶時被其它奶牛看見.

約翰希望你幫他計算一下:如果要滿足奶牛們的要求,並且每天每頭奶牛都要被擠過奶,至少需要多少牛棚 •每頭牛應該在哪個牛棚被擠奶。如果有多種答案,你只需任意一種即可。

輸入輸出格式

輸入格式:

Line 1: A single integer, N

Lines 2..N+1: Line i+1 describes cow i’s milking interval with two space-separated integers.

輸出格式:

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.

輸入輸出樣例

輸入樣例#1:

5
1 10
2 4
3 6
5 8
4 7

輸出樣例#1:

4
1
2
3
2
4

說明

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.

程式

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;

int order[50010];
int n,ans;
struct Node{
    int st,en,pos;
    friend bool operator<(Node a,Node b){
        if(a.en==b.en)  return a.st<b.st;
        return a.en>b.en;
    }
}node[50010];

bool cmp(Node a,Node b){
    if(a.st==b.st)  return a.en<b.en;
        else    return a.st<b.st;
}

priority_queue<Node>Q;

int main(){
    while(~scanf("%d",&n)){
        for(int i=1;i<=n;i++){
            cin>>node[i].st>>node[i].en;
            node[i].pos=i;
        }
        sort(node+1,node+1+n,cmp);
        ans=1;
        Q.push(node[1]);
        order[node[1].pos]=1;
        for(int i=2;i<=n;i++){
            if(!Q.empty()&&Q.top().en<node[i].st){
               order[node[i].pos]=order[Q.top().pos];
               Q.pop();
            }
            else{
                ans++;
                order[node[i].pos]=ans;
            }
            Q.push(node[i]);
        }
        cout<<ans<<endl;
        for(int i=1;i<=n;i++)   cout<<order[i]<<endl;
        while(!Q.empty())  Q.pop();
    }
    return 0;
}