bzoj3362 導航難題 帶權並查集

2022-05-31 07:42:08 字數 1791 閱讀 8808

題意:

約翰所在的鄉村可以看做乙個二維平面,其中有n 座牧場,每座牧場都有自己的座標,編號為1

到n。牧場間存在一些道路,每條道路道路連線兩個不同的牧場,方向必定平行於x 軸或y軸。連通兩座牧場之間的路徑是唯一的。

突然間,約翰的導航儀失靈了,牧場的座標記錄全部消失了。所幸的是,約翰找到了表示道路的

資料,可以通過這些資訊得知牧場間的相對位置。但貝西有急事,在約翰工作到一半的時候就要知道

一些牧場間的曼哈頓距離。這時,如果約翰能從找回的道路資訊之間推算出答案,就會告訴貝西。請

你幫助約翰來回答貝西的問題吧。(x1,y1) 和(x2,y2) 間的曼哈頓距離定義為|x1 − x2| + |y1 − y2|。

– 如果字母是e、s、w 和n 中的乙個,表示約翰找回了一條道路的資訊,接下來有三個整

數x,y,和l,l 表示道路的長度,x,y表示道路連線的兩個牧場,字母e、s、w、n

分別表示x在y的東、南、西、北方向。1 ≤x,y≤ n; 1 ≤ l ≤ 1000

1 ≤ n ≤ 40000; 1 ≤ q ≤ 50000

題解:對於每個點x,維護三個值:

fa[x]:x所在並查集的祖先,或者說是x的乙個祖先。

f[x]:x到fa[x]的x座標的差值,即x(x)-x(fa[x])

g[x]:x到fa[x]的y座標的差值,即y(x)-y(fa[x])

則並查集內任意亮點的x,y的曼哈頓距離為abs(f[x]-f[y])+abs(g[x]-g[y])

對於每條路徑(x,y,len),我們可以把fa[x]連向y,則兩個並查集合並。

設xx=fa[x],則fa[xx]=y。

f[xx]=x(xx)-x(y)=x(x)-x(y)-(x(x)-x(xx))=(+-)len-f[x]

g[xx]同理。

-1的情況:如果x和y不在同乙個並查集內,則輸出-1

**:

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include

9using

namespace

std;

1011

const

int n=40010;12

intn,m,q,f[n],g[n],fa[n],ans[n];

13struct

nodea[n];

17struct

nodq[n];

20int myabs(int x)

21bool cmp(nod x,nod y)

2223

int findfa(int

x)24

32return

fa[x];33}

3435

intmain()

3650 scanf("

%d",&q);

51for(int i=1;i<=q;i++)

5256 sort(q+1,q+1+q,cmp);

57int j=1;58

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

5969

if(a[i].s[0]=='w'

)7074if(a[i].s[0]=='n'

)7579if(a[i].s[0]=='s'

)8084while(j<=q && q[j].t==i)

8592}93

for(int i=1;i<=q;i++) printf("

%d\n

",ans[i]);

94return0;

95 }

bzoj3362 導航難題 帶權並查集

題意 約翰所在的鄉村可以看做乙個二維平面,其中有n 座牧場,每座牧場都有自己的座標,編號為1 到n。牧場間存在一些道路,每條道路道路連線兩個不同的牧場,方向必定平行於x 軸或y軸。連通兩座牧場之間的路徑是唯一的。突然間,約翰的導航儀失靈了,牧場的座標記錄全部消失了。所幸的是,約翰找到了表示道路的 資...

BZOJ 1202 帶權並查集

1202 hnoi2005 狡猾的商人 description 刁奼接到乙個任務,為稅務部門調查一位商人的賬本,看看賬本是不是偽造的。賬本上記錄了n個月以來的收入情況,其中第i 個月的收入額為ai i 1,2,3 n 1,n 當 ai大於0時表示這個月盈利ai 元,當 ai小於0時表示這個月虧損ai...

帶權並查集 bzoj 1202

time limit 10 sec memory limit 162 mb submit 1745 solved 837 submit status discuss 刁奼接到乙個任務,為稅務部門調查一位商人的賬本,看看賬本是不是偽造的。賬本上記錄了n個月以來的收入情況,其中第i 個月的收入額為ai ...