做題記錄22.3.31 洛谷P2250
阿新 • • 發佈:2022-04-01
由於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++; }