乙個平面直角座標系,座標\(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樹是二進位制空間分割樹的特殊的情況。大概思路就是每次確定乙個軸,將...