cow按st排序
stall按ed排序
其实stall里的st并不用维护,因为cow已经关于st自然有序
/*H E A D*/
struct A{
int id,st,ed;
}a[maxn];
bool cmp(A a,A b){
if(a.st!=b.st) return a.st<b.st;
return a.ed<b.ed;
}
struct B{
int id,st,ed;
bool operator < (const B &rhs)const{
return ed>rhs.ed;
}
}b[maxn];
int main(){
int n,ans[maxn];
while(~iin(n)){
priority_queue<B> que;
while(!que.empty())que.pop();
rep(i,1,n){
a[i].id=i;
a[i].st=read();
a[i].ed=read();
}
sort(a+1,a+1+n,cmp);
int cnt=0;
// int now=0;
rep(i,1,n){
// bool flag=0;
// rep(j,1,now){
// if(a[i].st>b[j].ed||a[i].ed<b[j].st){
// flag=1;
// b[j].ed=max(a[i].ed,b[j].ed);
// b[j].st=min(a[i].st,b[j].st);
// // cout<<j<<" "<<b[j].st<<" "<<b[j].ed<<endl;
// ans[a[i].id]=j;
// break;
// }
// }
// if(flag==0){
// now++;
// b[now].st=a[i].st;
// b[now].ed=a[i].ed;
// // cout<<now<<" "<<b[now].st<<" "<<b[now].ed<<endl;
// ans[a[i].id]=now;
// }
if(que.empty()||que.top().ed>=a[i].st){
B tmp;
tmp.st=a[i].st;
tmp.ed=a[i].ed;
tmp.id=++cnt;
que.push(tmp);
ans[a[i].id]=cnt;
continue;
}
B tmp=que.top();que.pop();
tmp.ed=max(tmp.ed,a[i].ed);
tmp.st=min(tmp.st,a[i].st);
ans[a[i].id]=tmp.id;
que.push(tmp);
}
println(cnt);
rep(i,1,n){
println(ans[i]);
}
}
return 0;
}