做法,
將讀入的每個點(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...