一道離散化的題,不算難,但想不到用離散化思想也會暴力水掉。。。
描述 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.又因為單個牧場直徑可能大於...