码迷,mamicode.com
首页 > 其他好文 > 详细

做题记录:P1196 [NOI2002]银河英雄传说

时间:2018-02-10 11:22:45      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:str   cst   can   stream   传说   ret   nbsp   int   else   

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]银河英雄传说

标签:str   cst   can   stream   传说   ret   nbsp   int   else   

原文地址:https://www.cnblogs.com/wozaixuexi/p/8438076.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!