按照开始时间排序,找已经开的栏里的最早结束时间的栏,如果这个最早时间比当前开始时间早,那么把这头牛加入这个栏杆,否则只能新开一个了。用堆优化
const int N = 5e4 + 79;
int n;
int tot;
#define pii std::pair<int,int>
std::priority_queue<pii, std::vector<pii>, std::greater<pii> >q;
//½áÊøʱ¼ä£¬±àºÅ
struct data {
int l, r, num, id;
bool operator <(const data&rhs)const {
return l < rhs.l;
}
} a[N];
int ans[N];
int main() {
read(n);
tot = 1;
rep(i, 1, n) {
read(a[i].l);
read(a[i].r);
a[i].id = i;
}
std::sort(a + 1, a + n + 1);
a[1].num = 1;
q.push({a[1].r, 1});
rep(i, 2, n) {
int x = q.top().first;//最早结束的时间
int y = q.top().second;
if(a[i].l > x) {
q.pop();
a[i].num = y;
q.push({a[i].r, y});
} else {
++tot;
a[i].num = tot;
q.push({a[i].r, tot });
}
}
rep(i,1,n){
ans[a[i].id]=a[i].num;
}
out(tot,'
');
rep(i,1,n){
out(ans[i],'
');
}
return 0;
}