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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

叠积木

發布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 叠积木 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【題目描述】

約翰和貝西在疊積木。共有30000塊積木,編號為1到30000。一開始,這些積木放在地上,自然地分成N堆。貝西接受約翰的指示,把一些積木疊在另一些積木的上面。一旦兩塊積木相疊, 彼此就再也不會分開了,所以最后疊在一起的積木會越來越高。約翰讓貝西依次執行P條操作,操作分為兩種:

第一種是移動操作,格式為“移動X到Y的上面”。X和Y代表兩塊積木的編號,意思是將X所的那堆積木,整體疊放到Y所在的那堆積木之上;

第二種是統計操作,格式為“統計Z下方的積木數量”。Z代表一塊積木的編號,意思是貝西需要報告在編號為Z的積木之下還有多少塊積木

請編寫一個程序,幫助貝西回答每條統計問題。

【輸入描述】

第一行一個整數P(1 ≤ P ≤ 10^5);

第二行到第P+1行,每行描述一條命令,如果這行開頭的字母是M,代表一條移動命令,后面的兩個整數代表上文中的X和Y;如果開頭字母是C,代表一條統計命令。后面的整數代表上文中的Z,保證所有的移動命令都有意義,X和Y不會已經出現在同一堆積木里。

【輸出描述】

對每一個統計命令,輸出正確回答,用換行符分開每個查詢的結果

【輸入樣例】

6

M 1 6

C 1

M 2 4

M 2 6

C 3

C 4

【輸出樣例】

1

0

2

【數據范圍及提示】

第一次查詢時,1下面只有一個6;第二次查詢時,3下面沒有任何積木;第三次查詢時,4下面有兩塊積木:1和6。

源代碼:#include<cstdio> #include<iostream> using namespace std; int n,f[30001],top[30001],sum[30001]; int Find(int t) {if (f[t]==t)return t;int T=f[t];f[t]=Find(T);top[t]=top[T];sum[t]+=sum[T];return f[t]; } int Merge(int t1,int t2) {int T1=Find(t1);int T2=Find(t2);f[T1]=T2;Find(top[T2]);sum[T1]=sum[top[T2]]+1;top[T2]=top[T1]; } int main() {scanf("%d",&n);for (int a=1;a<=30000;a++)top[a]=f[a]=a;for (int a=1;a<=n;a++){char T;cin>>T;if (T=='M'){int t1,t2;scanf("%d%d",&t1,&t2);Merge(t1,t2);}else{int t;scanf("%d",&t);Find(t);printf("%d\n",sum[t]);}}return 0; }

?

轉載于:https://www.cnblogs.com/Ackermann/p/5756625.html

總結

以上是生活随笔為你收集整理的叠积木的全部內容,希望文章能夠幫你解決所遇到的問題。

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