了解奶牛們的人都知道,奶牛喜歡成群結隊.觀察約翰的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...