1. 程式人生 > >做題記錄:P1196 [NOI2002]銀河英雄傳說

做題記錄:P1196 [NOI2002]銀河英雄傳說

blank 就是 scanf sca 記錄 blog 英雄 show 路徑

P1196 [NOI2002]銀河英雄傳說

//P1196 [NOI2002]銀河英雄傳說
#include<iostream>
#include<cstdio>
#include<cmath>
    using namespace std;
    int f[30005],p[30005],s[30005];
    //f[i]表示第i艘戰艦與哪一艘戰艦在同一列中
    //p[i]表示第i艘戰艦的前面有多少艘戰艦
    //s[i]表示第i列有多少艘戰艦 
void find_x(int x)//起到路徑壓縮的作用 
{
    if(f[x]==x) return;//如果找到了祖先,就結束 
find_x(f[x]);//如果沒有,就繼續找 p[x]+=p[f[x]];//更新p[x]的值 f[x]=f[f[x]];//路徑壓縮 } int main() { for(int i=1;i<=30000;i++)//初始化 { f[i]=i; s[i]=1; p[i]=0; } int T=0; scanf("%d",&T); for(int q=1;q<=T;q++) { char x= ; int y=0
,z=0; scanf(" %c%d%d",&x,&y,&z); if(x==M)//合並操作 { find_x(y); find_x(z); int tx=f[y],ty=f[z]; f[tx]=ty;//合並 p[tx]=s[ty];//合並到另一列的那個隊列的隊首戰艦前面的戰艦數就是另一列的總戰艦數 s[ty]+=s[tx];//更新這一列的戰艦數 s[tx]=0
;//更新這一列的戰艦數 } else//詢問 { find_x(y); find_x(z); int tx=f[y],ty=f[z]; if(tx!=ty) printf("-1\n");//如果不在同一列,輸出-1 else printf("%d\n",int(abs(p[y]-p[z])-1));//否則輸出它們之間的戰艦數目 } } return 0; }

做題記錄:P1196 [NOI2002]銀河英雄傳說