zoukankan      html  css  js  c++  java
  • P1196 [NOI2002]银河英雄传说

    喵喵喵这道题这题跟搭积木很像,然而我居然迷失在了这令人心醉神迷的题面之中。。(逃

    好的呢这题就是一个比较绕的并查集,每次将一个的头接在要移到的地方的尾上,并每次访问的时候用将两个的后缀数相减即可得出答案

    #include<set>
    #include<map>
    #include<list>
    #include<queue>
    #include<stack>
    #include<string>
    #include<cmath>
    #include<ctime>
    #include<vector>
    #include<bitset>
    #include<memory>
    #include<utility>
    #include<cstdio>
    #include<sstream>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N=30005;
    
    int n;
    int f[N],s[N],b[N];
    
    int find(int o){//并查集
        if(f[o]==o){
    		return o;
    	}
        int k=f[o];
        f[o]=find(f[o]);
        s[o]+=s[k];
        b[o]=b[f[o]];
        return f[o];
    }
    
    int main(){
    	scanf("%d",&n);
        for(int i=1;i<=30000;i++){
    		f[i]=i;
    		s[i]=0;
    		b[i]=1;
    	}
        for(int i=1;i<=n;i++){
            char ch;
            int x,y,dx,dy;
            cin>>ch;
    		scanf("%d%d",&x,&y);
            if(ch=='M'){//加边情况
                dx=find(x);
                dy=find(y);
                f[dx]=dy;
                s[dx]+=b[dy];
                b[dx]+=b[dy];
                b[dy]=b[dx];
            }
            if(ch=='C'){//访问情况
                dx=find(x);
                dy=find(y);
                if(dx!=dy){
                	printf("-1
    ");
    				continue;
    			}
    			printf("%d
    ",abs(s[x]-s[y])-1);//输出
            }
        }
        return 0;
    }
    

      好的就酱紫

  • 相关阅读:
    蓝桥杯省赛经验
    阅读笔记四
    阅读笔记二
    阅读笔记一
    动态规划——Maximum Sum of 3 Non-Overlapping Subarrays
    动态规划——Remove Boxes
    动态规划——Dungeon Game
    动态规划——Freedom Trail
    动态规划——Frog Jump
    《软件需求十步走》阅读笔记一
  • 原文地址:https://www.cnblogs.com/hahaha2124652975/p/11150086.html
Copyright © 2011-2022 走看看