POJ3470 Walls(線段樹)(掃瞄線)

2021-08-04 13:35:16 字數 2496 閱讀 8406

本義

有n堵牆,m只智障鳥,給出牆端點座標,鳥座標,牆一定是平行於座標軸,橫著或豎著,每只鳥都會選乙個離自己最近的牆撞過去,鳥一定是平行於座標軸飛行,只能橫著或豎著飛,問每堵牆被幾隻鳥撞過。

題目沒說的坑爹問題:

#include

#include

#include

using

namespace

std;

const

int maxn=200010;

struct bird

};bool bird_cmpx_g(bird a,bird b)

bool bird_cmpy_l(bird a,bird b)

struct wall

inline

bool mode()

};bool wall_cmpx_g(wall a,wall b)

bool wall_cmpy_g(wall a,wall b)

bool wall_cmpx_l(wall a,wall b)

bool wall_cmpy_l(wall a,wall b)

class segtree

void insert(int l,int r,int val,int id=1,int l=0,int r=n)

if(wid[id]!=-1)

wid[id*2]=wid[id*2+1]=wid[id];

insert(l,r,val,id*2,l,(l+r)/2);

insert(l,r,val,id*2+1,(l+r)/2+1,r);

if(wid[id*2]==-1||wid[id*2+1]==-1||wid[id*2]!=wid[id*2+1])

wid[id]=-1;

}int query(int pos,int id=1,int l=0,int r=n)

};wall wall[maxn];

bird bird[maxn];

long

long mapx[maxn*3],mapy[maxn*3];

int x_cnt,y_cnt;

long

long dis[maxn];

int ans[maxn],hitid[maxn];

segtree st;

int segtree::n;

int main()

for(int i=1;i<=m;i++)

memset(dis,0x7f,sizeof dis);

//排序,離散化牆,鳥的座標

sort(mapx,mapx+x_cnt);

sort(mapy,mapy+y_cnt);

for(int i=1;i<=n;i++)

for(int i=1;i<=m;i++)

int wid,bid;

//設定牆同一直線總是座標小的在前,方便排序

for(int i=1;i<=n;i++)

//初始化,按x從小到大排序

wid=bid=1;

st.init(3*n);

sort(wall+1,wall+n+1,wall_cmpx_g);

sort(bird+1,bird+m+1,bird_cmpx_g);

//掃瞄線,從左到右,從下到上,鳥向左撞

while(wid<=n||bid<=m)

//更新鳥的答案

else

if(bid<=m)

}bid++;}}

//初始化,按y從小到大排序

wid=bid=1;

st.init(3*n);

sort(wall+1,wall+n+1,wall_cmpy_g);

sort(bird+1,bird+m+1,bird_cmpy_g);

//掃瞄線,從下到上,從左到右,鳥向下撞

while(wid<=n||bid<=m)

//更新鳥的答案

else

if(bid<=m)

}bid++;}}

//設定牆同一直線總是座標大的在前,方便排序

for(int i=1;i<=n;i++)

//更新鳥的答案

else

if(bid<=m)

}bid++;}}

//初始化,按y從大到小排序

wid=bid=1;

st.init(3*n);

sort(wall+1,wall+n+1,wall_cmpy_l);

sort(bird+1,bird+m+1,bird_cmpy_l);

//掃瞄線,從上到下,從右到左,鳥向下撞

while(wid<=n||bid<=m)

//更新鳥的答案

else

if(bid<=m)

}bid++;}}

//輸出

for(int i=1;i<=n;i++)

printf("%d\n",ans[i]);

return

0;}

POJ 3470 線段樹 掃瞄線法

大致題意 有n堵水平於座標軸的牆,以及m只小鳥,小鳥一定會朝離自己最近的牆飛去撞暈自己,且只能飛向平行於座標軸的 4個方向,撞到牆的邊緣也算合理衝撞 即是說可以往延長線飛 求各堵牆上各撞了幾隻小鳥。n,m 50000。題解 用線段樹維護牆的索引值,對應於小鳥的4個方向,分別在x,y軸上正向和反向掃瞄...

POJ 2155 樹套樹 線段樹套線段樹

matrix 樓教主出的題目。題意 乙個矩陣初始值都為0,每次給 c x1 y1 x2 y2 去反轉這個矩陣。或者 q x1 y1 查詢這個點是0 1。第一次接觸樹套樹的題目。一句ac 對於基本的線段樹,再在每個節點建乙個y方向上的線段樹。tree n m 這道題目更新的時候,對於x方向就是 x1,...

POJ 2155 二維線段樹 線段樹套線段樹

題目大意 二維區間裡,某個矩形裡都是01,選乙個矩形,裡面數字01翻轉。最後不停的問某個座標是0還是1.poj不支援c 1所以常用標頭檔案要注釋掉很多 大致二維線段樹就是這樣的了 每個節點都是乙個線段樹。qc大爺說二維線段樹不支援打標記。好像這題也不用打標記了,只能標記永久化 include inc...