P1166 牛棚擴張

2021-09-30 12:00:03 字數 1433 閱讀 6302

一道離散化的題,不算難,但想不到用離散化思想也會暴力水掉。。。

描述 description

fj有n (1 <= n <= 25,000)個矩形牛棚,它們的牆均與座標軸平行,而且其座標在0..1,000,000之間,任意兩個牛棚不能重疊,但可能會有公共的牆。

由於fj的奶牛持續增加,他不得不考慮擴張牛棚,乙個牛棚可以擴張,當且僅當他的四周均不與其他牛棚接觸,如果兩個牛棚有乙個公共角,那他們都是不可擴張的。

統計有多少牛棚可以擴張。

輸入格式 input format

* line 1: 乙個整數表示有 n個牛棚

* lines 2..n+1:每行四個整數,表示乙個牛棚的左下角的座標和右上角的座標。.

輸出格式 output format

* line 1:乙個整數表示有幾個牛棚可以擴張.

下面說下本題的離散化要點:

將每乙個矩形拆成兩條橫邊和兩條豎邊分開處理。對於每一條橫邊,我們只用記錄它的x值,左右兩端點的y值以及它所屬的矩形編號i

(用在後面的記錄)

,豎邊同理; 

然後是對橫豎邊分別進行的多關鍵字排序:(這裡非常重要,因為每乙個矩形都只會也只能與自己鄰近的矩形有重合邊的可能,所以對邊的排序可以讓

「矩形」·有序化·

,我們就可以只判斷邊i與邊i+1是否滿足條件即可。這就是離散化在這裡可以降低時間複雜度到o(n)級別的原因)

然後分別列舉橫邊與豎邊,判斷相鄰兩邊是否滿足條件並記錄(這裡注意迭代的細節問題)

差不多就是這樣。

code:

#include

#include

#include

#include

#include

#include

#include

using namespace std;

struct ll

shu[52000];

struct lll

heng[52000];

int n;

bool linee(ll a,ll b)

sort(shu+1,shu+2*n+1,linee);

sort(heng+1,heng+2*n+1,listt);

memset(fff,1,sizeof(fff));

/*cout<<"***********************************===="<=shu[i+1].y1)

}if(!q) tail=shu[i+1].y2;

}tail=heng[1].x2;

for(int i=1;i<2*n;i++)

}if(!q) tail=heng[i+1].x2;

}int ans=0;

for(int i=1;i<=n;i++)

if(fff[i])

ans++;

cout<

請教神牛p1337

描述 description hzgd神牛是個非常牛b的人,每天都有人來向他請教問題.但是他有原則.同乙個人不能在乙個學期內請教他兩次,並且他每天只見乙個請教者,無論他以前是否請教過,否則他就沒時間去幹其他事情了,嘿嘿 壞笑 就是不見寧智賢 於是,現在的問題就是,神牛並不是總記得每乙個人.所以,你需...

洛谷 P1565 牛宮

題目 牛宮 思路 咳咳,先放個提交記錄 嗯再來個mjy0724的思路 然後就沒我什麼事了 有這麼幾點需要注意的地方 1 vector一定不能作為引數傳進函式,會t到飛起,親測100 50 2 第一列數要單獨判斷 3 字首和的處理,i,j 的字段和大於0的條件是sum j sum i 1 而非sum ...

P1522 牛的旅行 flody

初入手,苦思不得其解。後看題解,恍然大悟。乙個牧場的直徑就是牧場中最遠的兩個牧區的距離 最小直徑 新道路左端點所能到達的最遠點 新道路長度 新道路右端點所能到達的最遠點 1.先來一套flody。2.然後遍歷每個節點記錄每個點所能到達的最遠點的距離。3.再遍歷求最小直徑。4.又因為單個牧場直徑可能大於...