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;
}

相关