奶牛鄰居 treap 契比雪夫距離 並查集

2022-08-17 14:24:10 字數 2350 閱讀 2011

了解奶牛們的人都知道,奶牛喜歡成群結隊.觀察約翰的n(1≤n≤100000)只奶牛,你會發現她們已經結成了幾個「群」. 

每只奶牛在吃草的時候有乙個獨一無二的位置座標xi,yi(l≤xi,yi≤[1~109];xi,yi∈整數. 

當滿足下列兩個條件之一,兩隻奶牛i和j是屬於同乙個群的:  

1.兩隻奶牛的曼哈頓距離不超過c(1≤c≤109),即lxi - xjl+iyi- yjl≤c.  

2.兩隻奶牛有共同的鄰居.即,存在乙隻奶牛k,使i與k,j與k均同屬乙個群.  

給出奶牛們的位置,請計算草原上有多少個牛群,以及最大的牛群裡有多少奶牛? 

蒟蒻$fhq treap$初學,所以**巨醜,封裝的也不美觀,導致$insert等操作在main$函式裡顯得很長,這也是我調了很長時間的原因。

對於曼哈頓距離$|x[i]-x[j]|+|y[i]-y[j]|$,我們將其轉化為契比雪夫距離$max(|x[i]-x[j]|,|y[i]-y[j]|)$,此時座標$(x,y)變成了(x+y,x-y)$。

這樣問題便簡化了:我們按x為第一關鍵字,$y$為第二關鍵字排序。把$x$扔進佇列裡,維護$fhq treap$,裡面存的是區間$[head,i](x[i]-x[head]<=c)$中所有的y值,這樣我們找到$fhq treap中y[i]$的前驅和後繼用並查集合並即可。**比較難打。

#include#include

#include

#include

#include

#include

#define lc(x) ch[x][0]

#define rc(x) ch[x][1]

using

namespace

std;

typedef

long

long

ll;const ll n=100010

;const ll inf=99999999999999999

;struct

node

cow[n],fir[n];

ll ch[n][

2],rnk[n],id[n],sz[n],root,x,y,z,cnt;

ll val[n];

ll n,c;

ll ans;

inline ll read()

while(ch>='

0'&&ch<='9')

return x*f;}

bool

cmp(node a,node b)

ll father[n],tot[n];

inline ll new_node(ll x,ll pos)

inline

void

pushup(ll now)

inline

void split(ll now,ll k,ll &x,ll &y)}

inline ll merge(ll x,ll y)

else }

inline ll kth(ll now,ll k)}

inline ll find(ll x)

intmain()

sort(cow+1,cow+1+n,cmp);

for(ll i=1;i<=n;i++)father[i]=i,tot[i]=1

; root=new_node(cow[1].y,cow[1

].id);

split(root,-inf,x,y);root=merge(merge(x,new_node(-inf,0

)),y);

split(root,inf,x,y);root=merge(merge(x,new_node(inf,n+1

)),y);

ll head=1

;

for(ll i=2;i<=n;i++)

split(root,cury,x,y);

ll pre=id[kth(x,sz[x])];

root=merge(x,y);

split(root,cury-1

,x,y);

ll nxt=id[kth(y,1

)]; root=merge(x,y);

//cout<<"pre nxt="}

if(abs(fir[pre].y-cury)<=c)

}split(root,cury,x,y);

root=merge(merge(x,new_node(cury,cow[i].id)),y);

}ll ans=0

; ll maxn=0

;

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

cout

<"

"<}

切比雪夫距離

切比雪夫距離是什麼呢?假設有兩個點,a x,y b m,n 那麼這兩個點的切比雪夫距離就是max x m y n 然而它有什麼卵用嗎?我也不知道 然而它可以轉化為曼哈頓距離,這就非常6了.用了乙個非常神奇的思想.我們把座標系順時針旋轉45 這個點到原點的距離是固定的,然後我們用和角公式,這個點的座標...

切比雪夫距離

若點 a x 1,y 1 b x 2,y 2 則兩點間的曼哈頓距離為 x 1 x 2 y 1 y 2 已知 n 個點求兩兩之間的曼哈頓距離之和,易得 x 的貢獻與 y 的貢獻是分開的 可以用兩次排序去絕對值 字首和解決 複雜度 o n log n 曼哈頓距離是 4 向移動的最少步數,切比雪夫距離則是...

1012 曼哈頓距離 切比雪夫距離

什麼是切比雪夫距離?什麼是曼哈頓距離?傻傻分不清,沒關係,看 曼哈頓距離設平面空間內存在兩點,它們的座標為 x1,y1 x2,y2 則dis x1 x2 y1 y2 即兩點橫縱座標差之和 切比雪夫距離 設平面空間內存在兩點,它們的座標為 x1,y1 x2,y2 則dis max x1 x2 y1 y...