BZOJ2716 天使玩偶

2022-05-20 06:15:23 字數 1272 閱讀 5221

乙個平面直角座標系,座標\(1\le x,y\le10^6\)。\(n(n\le10^6)\)次操作,操作包含以下兩種:

新增乙個點\((x,y)\);

詢問離\((x,y)\)最近的點的距離。

分別統計左下、左上、右上、右下的最近的點,每次使用cdq分治。樹狀陣列維護最小值。

有乙個一樣的題是sjy擺棋子,不過cdq會被卡,需要用kd樹才能過。

#include#include#include#includeinline int getint() 

const int n=1e6+1,m=5e5;

struct node ;

node a[n];

int ans[m],lim;

inline bool cmp1(const node &p1,const node &p2)

return p1.t>1;

cdq(b,mid);

cdq(mid+1,e);

int p=b,q=mid+1;

for(;q<=e;q++)

const int tmp=t.query(a[q].y);

if(tmp==int_max) continue;

ans[a[q].t]=std::min(ans[a[q].t],tmp-(n-a[q].y-a[q].x));

} while(--p>=b)

std::inplace_merge(&a[b],&a[mid]+1,&a[e]+1,cmp2);

}int main()

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

t.reset();

std::sort(&a[1],&a[n+m]+1,cmp1);

cdq(1,n+m);

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

std::sort(&a[1],&a[n+m]+1,cmp1);

cdq(1,n+m);

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

std::sort(&a[1],&a[n+m]+1,cmp1);

cdq(1,n+m);

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

std::sort(&a[1],&a[n+m]+1,cmp1);

cdq(1,n+m);

for(register int i=0;i<=cnt;i++)

return 0;

}

BZOJ2716 天使玩偶 kd樹

這個題要求kd樹支援兩個操作。1.插入乙個新的點。2.查詢某個點最近曼哈頓距離。注意查詢曼哈頓距離和查詢歐幾里得距離,是有區別的。估價函式不同 1 include 2 include 3 include 4 include 5 include 6 using namespace std 7const...

刷題總結 天使玩偶(bzoj2716)

學了cdq後近期最後一道題 然而tm還是搞了1個半小時才tm搞出來 先說思路 對於絕對值,我們採取類似於旋轉整個圖的方法,也就是說共計三次翻轉再加上原來的圖,每次旋轉90度,算出點在旋轉後的對應座標 具體看 中的注釋部分 然後對於乙個詢問,每次只算它左上角的點的貢獻,這樣就有乙個三維偏序 時間,x,...

bzoj2716 Violet 3 天使玩偶

傳送門 這題好像有cdq分治做法 不過我太菜了沒聽懂 於是我打了一發kdtree 度娘 k d樹 k dimensional樹的簡稱 是一種分割k維資料空間的資料結構。主要應用於多維空間關鍵資料的搜尋 如 範圍搜尋和最近鄰搜尋 k d樹是二進位制空間分割樹的特殊的情況。大概思路就是每次確定乙個軸,將...