1. 程式人生 > 其它 >做題記錄22.3.31 洛谷P2250

做題記錄22.3.31 洛谷P2250

由於CSDN新增了字數限制,即日起本人開始轉戰部落格園

題目連結

這題我原本的想法是:按先x後y的升序排序,隨後對於任意一個i,查詢和i+1相交的部分,並在這部分從右往左種樹。最後進行檢查,把不滿足條件的地點種上樹即可。但這種方法好像難以實現,因為情況比較多,比如完全包含、部分相交、完全不相交等。

其實可以這樣思考:既然要種得儘可能少,那麼完全可以在每一個區間都從右向左。但應當按照先y後x升序排序。否則會導致 一個區間完全包含在另一個區間的情況出現錯誤。

sort(a+1,a+h+1,[&](Tree a,Tree b) {
	return (r<a.r)||(r==a.r&&l<a.l);
});
for(int i=1; i<=h; i++) {
	//檢查
	for(int j=a[i].r; j>=a[i].l; j--) {
		if(vis[j])	cnt[i]++;
	}
	//在尾部種樹
	for(int j=a[i].r; j>=a[i].l&&cnt[i]<a[i].c; j--) {
		if(!vis[j]) {
			vis[j]=1;
			cnt[i]++;
		}
	}
}
//最後檢查
for(int i=1; i<=a[h].r; i++) {
	if(vis[i])	res++;
}