題意:給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...