Sample Input
5 1 10 2 4 3 6 5 8 4 7
Sample Output
4 1 2 3 2 4
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct Cow{
int a,b;
int No;
bool operator<(const Cow & c)const{
return a<c.a;
}
}cows[50100];
int pos[50100];
struct Stall{
int end;
int No;
bool operator<(const Stall&s)const{
return end>s.end;
}
Stall(int e,int n):end(e),No(n){ }
};
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%d%d",&cows[i].a,&cows[i].b);
cows[i].No=i;
}
sort(cows,cows+n);
int total=0;
priority_queue<Stall> pq;
for(int i=0;i<n;++i){
if(pq.empty()){
++total;
pq.push(Stall(cows[i].b,total));
pos[cows[i].No]=total;
}
else {
Stall st=pq.top();
if(st.end<cows[i].a){
pq.pop();
pos[cows[i].No]=st.No;
pq.push(Stall(cows[i].b,st.No));
}
else
{
++total;
pq.push(Stall(cows[i].b,total));
pos[cows[i].No]=total;
}
}
}
printf("%d\n",total);
for(int i=0;i<n;i++)
{
printf("%d\n",pos[i]);
}
system("pause");
return 0;
}