HDU 5091 掃瞄線 線段樹優化

2021-06-26 22:07:13 字數 1050 閱讀 1261

做法,

將讀入的每個點(x,y)看做乙個以該點為左上角寬w高h的矩形, 然後將矩形看做兩條平行y軸(起點y-h,終點y)線,橫座標分別為 x , x+w; 

然後可用經典的掃瞄線演算法求解該題,即找出所有矩形重疊的最多次數,即所求值

證明 :

都在乙個矩形內的點必定他們的上述規定的矩形都兩兩相交,而矩形兩兩相交必然有共同的交點是的所有矩形都相交於此;

#include #include #include #include #include #include #include using namespace std;

#define lson l,m,(rt<<1)

#define rson m+1,r,(rt<<1|1)

const int n = 81500;

const int maxn = 10010;

const int yadd = 61000;

int x[maxn],y[maxn],n,w,h;

struct segment

bool operator < (const segment& rhs) const

};vectorans;

int max[n<<2],col[n<<2];

void build(int l,int r,int rt)

void pushup(int rt)

void pushdown(int rt)

}int ans,ql,qr,fff;

void update(int l,int r,int rt)

pushdown(rt);

int m=(l+r)>>1;

if(ql<=m) update(lson);

if(qr> m) update(rson);

pushup(rt);

}int maxs = 81250;

int main()

sort(ans.begin(),ans.end());

build(1,maxs,1);

int res=0;

for(int i=0;i

hdu5091(掃瞄線 線段樹)

題意 給n個點,和長w寬h的矩形,問矩形最多能包含多少個點。思路 掃瞄線 線段樹,首先將座標轉化成非負數,對於每個點 x,y 標記為1,生成乙個 x w,y 的點,標記為 1,然後將y軸建立線段樹,維護乙個最大值即可。如不不明白的話,畫個圖,理解一下就好了。如下 include include in...

HDU 5091 線段樹掃瞄線

給出n個點。和乙個w h的矩形 給出n個點的座標,求該矩形最多能夠覆蓋多少個點 對每乙個點point x。y 右邊生成相應的點 x w,y 值為 1 縱向建立線段樹,從左到右掃瞄線掃一遍。遇到點則用該點的權值更新區間 y,y h include stdio.h include string.h in...

HDU 1542 掃瞄線 線段樹優化

有些需要說明的地方 以前寫線段樹時線段樹的每個葉節點為乙個數字,代表乙個區域 7 代表第七個單位長度區域 本題不同在於,最小單位區域必須有兩點代表 2 3 代表從2到3 的乙個區域 上篇掃瞄線演算法複雜度為o n 2 本題用離散化法加線段樹優化為nlog n include include incl...