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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

2017百度之星程序设计大赛 - 初赛(A)数据分割

發(fā)布時(shí)間:2025/3/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2017百度之星程序设计大赛 - 初赛(A)数据分割 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

n<=100000條相等/不等關(guān)系描述<=100000個(gè)數(shù),把這些數(shù)據(jù)分割成若干段使得每一段描述都出現(xiàn)沖突且沖突只出現(xiàn)在最后一行。

相等關(guān)系具有傳遞性,并查集維護(hù);不等關(guān)系根據(jù)相等關(guān)系進(jìn)行合并,采用平衡樹(shù)的啟發(fā)式合并。

每次遇到相等關(guān)系x,y,先找到x,y對(duì)應(yīng)并查集的根p,q,判是否p在q的不等關(guān)系中,若否說(shuō)明成立,這時(shí)應(yīng)合并并查集,并合并兩棵平衡樹(shù),小的合到大的上。

每次遇到不等關(guān)系x,y,先找到x,y對(duì)應(yīng)并查集的根p,q,判是否p和q在同一個(gè)并查集中,若否說(shuō)明成立,這時(shí)應(yīng)把p和q分別添加到對(duì)方的平衡樹(shù)中。

平衡樹(shù)調(diào)用set即可。

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<math.h> 5 #include<algorithm> 6 #include<set> 7 //#include<iostream> 8 using namespace std; 9 10 int T,n=200001; 11 #define maxn 200011 12 set<int> s[maxn]; 13 int cnt,vis[maxn],sta[maxn],top; 14 struct UFS 15 { 16 int fa[maxn]; 17 UFS() {for (int i=1;i<=n;i++) fa[i]=i;} 18 int find(int x) {return x==fa[x]?x:(fa[x]=find(fa[x]));} 19 void Union(int &x,int &y) 20 { 21 x=find(x),y=find(y); 22 if (x!=y) fa[x]=y; 23 } 24 }ufs; 25 int x,y,id; 26 int ans[maxn],lans=0,Case; 27 void clear() 28 { 29 while (top) 30 { 31 int now=sta[top--]; 32 ufs.fa[now]=now; 33 s[now].clear(); 34 } 35 ans[cnt++]=Case; 36 } 37 int main() 38 { 39 scanf("%d",&T); 40 memset(vis,0,sizeof(vis)); 41 top=0;cnt=1; 42 for (Case=1;Case<=T;Case++) 43 { 44 scanf("%d%d%d",&x,&y,&id); 45 if (vis[x]!=cnt) vis[x]=cnt,sta[++top]=x; 46 if (vis[y]!=cnt) vis[y]=cnt,sta[++top]=y; 47 x=ufs.find(x),y=ufs.find(y); 48 if (s[x].size()>s[y].size()) {int t=x;x=y;y=t;} 49 if (id) 50 { 51 if (s[x].find(y)!=s[x].end()) 52 { 53 clear(); 54 continue; 55 } 56 ufs.Union(x,y); 57 for (set<int>::iterator i=s[x].begin();i!=s[x].end();i++) 58 { 59 int now=*i;now=ufs.find(now); 60 s[now].erase(x); 61 s[y].insert(now); 62 s[now].insert(y); 63 } 64 s[x].clear(); 65 } 66 else 67 { 68 if (x==y) 69 { 70 clear(); 71 continue; 72 } 73 s[x].insert(y); 74 s[y].insert(x); 75 } 76 } 77 printf("%d\n",cnt-1); 78 for (int i=1;i<cnt;i++) printf("%d\n",ans[i]-ans[i-1]); 79 return 0; 80 } View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/Blue233333/p/7352289.html

總結(jié)

以上是生活随笔為你收集整理的2017百度之星程序设计大赛 - 初赛(A)数据分割的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。