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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

洛谷P2342-叠积木

發(fā)布時(shí)間:2024/1/17 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷P2342-叠积木 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Problem 洛谷P2342-疊積木

Accept: 373 ? Submit: 1.1k

Time Limit: 1000 mSec????Memory Limit : 128MB

Problem Description

?

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

  •   ?第一種是移動操作,格式為“移動X到Y(jié)的上面”。X和Y代表兩塊積木的編號,意思是將X所的那堆積木,整體疊放到Y(jié)所在的那堆積木之上;
  •   ? ? 第二種是統(tǒng)計(jì)操作,格式為“統(tǒng)計(jì)Z下方的積木數(shù)量”。Z代表一塊積木的編號,意思是貝西需要報(bào)告在編號為Z的積木之下還有多少塊積木;
  • 請編寫一個(gè)程序,幫助貝西回答每條統(tǒng)計(jì)問題。

    ?

    ?

    ?Input

    第一行:單個(gè)整數(shù):P,1 ≤ P ≤ 10^5

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

    ?

    ?Output

      對每一個(gè)統(tǒng)計(jì)命令,輸出正確回答,用換行符分開每個(gè)查詢的結(jié)果

    ?

    ?Sample Input

    6
    M 1 6
    C 1
    M 2 4
    M 2 6
    C 3
    C 4

    ?

    Sample output

    1
    0
    2

    ?

    題目鏈接:https://www.luogu.org/problemnew/show/P2342

    ?

    題解:感覺這個(gè)題和一般的帶權(quán)并查集有那么一點(diǎn)點(diǎn)區(qū)別,記錄下來。

    每個(gè)集合的父節(jié)點(diǎn)是一堆積木的最下面的積木,權(quán)值是當(dāng)前積木到所在集合父節(jié)點(diǎn)的積木個(gè)數(shù)。

    兩點(diǎn)需要注意的,一是集合內(nèi)部關(guān)系更改,也就是rel數(shù)組,這個(gè)是在路徑壓縮的過程中遞歸實(shí)現(xiàn)的,二是集合之間關(guān)系的更改,不僅需要rel數(shù)組,還要利用Size數(shù)組(記錄每個(gè)集合當(dāng)前的大小),當(dāng)把一個(gè)集合放在另一個(gè)集合上面時(shí),上面積木的底部到下面積木的底部的積木個(gè)數(shù)就是Size[下面積木]。

    別忘了當(dāng)一堆積木放在別的積木上面的時(shí)候,Size要修改為0。

    ?

    1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 using namespace std; 6 7 const int maxn = 30000+10; 8 9 int rel[maxn],pre[maxn]; 10 int Size[maxn]; 11 12 int findn(int x){ 13 if(x == pre[x]) return x; 14 int temp = pre[x]; 15 pre[x] = findn(pre[x]); 16 rel[x] += (rel[temp]); 17 return pre[x]; 18 } 19 20 void merge_node(int x,int y){ 21 int fx = findn(x); 22 int fy = findn(y); 23 if(fx != fy){ 24 pre[fx] = fy; 25 rel[fx] = Size[fy]; 26 Size[fy] += Size[fx]; 27 Size[fx] = 0; 28 } 29 } 30 31 int main() 32 { 33 //freopen("input.txt","r",stdin); 34 int p,n,x,y; 35 char ch[10]; 36 n = 30005; 37 for(int i = 0;i < n;i++){ 38 pre[i] = i; 39 rel[i] = 0; 40 Size[i] = 1; 41 } 42 scanf("%d",&p); 43 for(int i = 1;i <= p;i++){ 44 scanf("%s",ch); 45 if(ch[0] == 'M'){ 46 scanf("%d%d",&x,&y); 47 merge_node(x,y); 48 } 49 else{ 50 scanf("%d",&x); 51 findn(x); 52 printf("%d\n",rel[x]); 53 } 54 } 55 return 0; 56 }

    ?

    ?

    ?

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

    總結(jié)

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

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