hdu5091(掃瞄線 線段樹)

2021-06-26 20:34:05 字數 939 閱讀 7672

題意:給n個點,和長w寬h的矩形,問矩形最多能包含多少個點。

思路:掃瞄線+線段樹,首先將座標轉化成非負數,對於每個點(x,y),標記為1,生成乙個(x+w,y)的點,標記為-1,然後將y軸建立線段樹,維護乙個最大值即可。如不不明白的話,畫個圖,理解一下就好了。

**如下:

#include#include#include#include#include#include#define n 20000

#define inf 0x7ffffff

#define eps 1e-9

#define pi acos(-1.0)

using namespace std;

struct node

s[2*n+5];

bool cmp(node a,node b)

struct tree

tree[4*2*n];

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

void pushup(int o)

void pushdown(int o)

}void update(int o,int x,int y,int v)

pushdown(o);

int m = (tree[o].l + tree[o].r)/2;

if(x <= m) update(2*o,x,y,v);

if(y > m) update(2*o+1,x,y,v);

pushup(o);

}int main()

sort(s,s+2*n,cmp);

build(1,1,2*n+1);

int ans = 0;

for(i = 0; i < 2*n; i++)

printf("%d\n",ans);

}return 0;

}

HDU 5091 線段樹掃瞄線

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

HDU 5091 掃瞄線 線段樹優化

做法,將讀入的每個點 x,y 看做乙個以該點為左上角寬w高h的矩形,然後將矩形看做兩條平行y軸 起點y h,終點y 線,橫座標分別為 x x w 然後可用經典的掃瞄線演算法求解該題,即找出所有矩形重疊的最多次數,即所求值 證明 都在乙個矩形內的點必定他們的上述規定的矩形都兩兩相交,而矩形兩兩相交必然...

hdu4007 線段樹掃瞄線

用變長為r的正方形最多能框住幾個點,線段樹,離散化,掃瞄線,延時標記lz include include include include include define n 2005 define inf 1 30 const double eps 1e 12 const double pi acos...