日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jzoj1503-体育场【带权并查集】

發布時間:2023/12/3 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jzoj1503-体育场【带权并查集】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題


大意

一個圓形300米的操場,外面位置無數排的椅子,然后給出一些條件,形式為:

A??????B??????x??????ABx
意思為A在B的順時針方向第x個,求有多少個要求無法滿足


解題思路

用并查集,然后一個farfar數組表示離它的fatherfather有多遠,每次壓縮路徑。之后如果輸入的A和B在一個分量內就進行判斷

(far[x]+w)%far[y](far[x]+w)%≠far[y]
這樣就累加不滿足的條件。
不然就進行連接
(far[x]?far[y]+w+300)%300(far[x]?far[y]+w+300)%300
這樣計算連接之后的距離,而且防止了負數情況


代碼

#include<cstdio> #include<algorithm> using namespace std; int n,m,x,y,w,father[50001],far[50001],s; int find(int x) {if (father[x]==x) {return x;}else{int fa=father[x];father[x]=find(father[x]);far[x]=(far[x]+far[fa])%300;//壓縮路徑return father[x];} } void unionn(int x,int y,int w) {int fa=find(x),fb=find(y);father[fb]=fa;far[fb]=(far[x]-far[y]+w+300)%300;//連接兩點 } int main() {scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)father[i]=i;for (int i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&w);if (find(x)==find(y)){if ((far[x]+w)%300!=far[y]) s++;//統計}elseunionn(x,y,w);//連接}printf("%d",s); }

總結

以上是生活随笔為你收集整理的jzoj1503-体育场【带权并查集】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。