P2859 [USACO06FEB]Stall Reservations S POJ3190
按照开始时间排序,找已经开的栏里的最早结束时间的栏,如果这个最早时间比当前开始时间早,那么把这头牛加入这个栏杆,否则只能新开一个了。用堆优化
const int N = 5e4 + 79;
int n;
int tot;
#define pii std::pair
std::priority_queue, std::greater >q;
//?áê?ê±??£?±ào?
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,'\n');
rep(i,1,n){
out(ans[i],'\n');
}
return 0;
}