Atcoder Beginner Contest 247 F - Cards 解題心得( 題目 )

解題概念:graph、連通塊

解題方法:本題可以把牌視為邊,連接兩個數字所形成的點,會形成許多連通塊,我們可以對於每個進行討論,發現數量1到4時分別有1、3、4、7種選法,後來發現其實他的關係很像費氏數列,只要先建表,之後DFS一次就好,時間複雜度為O(N)

//Author:En Chi Tsung(欉恩祁)

//Date:2022/04/13

import java.util.*;

import java.io.*;

public class Main {

    public static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

    public static BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));

    public static int ret,rd,cnt=0;

    public static long ans=1;

    public static final int mod=998244353;

    public static boolean neg;

    public static int[][] edge=new int[2][200005];

    public static int[] way=new int[200005];

    public static boolean[] vis=new boolean[200005];

    public static ArrayList<ArrayList<Integer>> e=new ArrayList<>();

    public static void main(String[] args) throws Exception{

        final int n=readint();

        for(int i=0;i<=n;i++) {

            e.add(new ArrayList<>());

        }

        for(int i=0;i<2;i++) {

            for(int j=0;j<n;j++) {

                edge[i][j]=readint();

            }

        }

        for(int i=0;i<n;i++) {

            e.get(edge[0][i]).add(edge[1][i]);

            e.get(edge[1][i]).add(edge[0][i]);

        }

        f();

        for(int i=1;i<=n;i++) {

            if(!vis[i]) {

                cnt=0;

                dfs(i);

                ans*=way[cnt];

                ans%=mod;

            }

        }

        System.out.println(ans);

    }

    

    public static void f() {

        way[1]=1;

        way[2]=3;

        for(int i=3;i<200005;i++) {

            way[i]=way[i-1]+way[i-2];

            way[i]%=mod;

        }

    }

    

    public static void dfs(int x) {

        vis[x]=true;

        cnt++;

        for(int i:e.get(x)) {

            if(vis[i])continue;

            dfs(i);

        }

    }

    public static int readint() throws Exception{

        ret=0;

        rd=br.read();

        while(rd>47&&rd<58) {

            ret*=10;

            ret+=(rd&15);

            rd=br.read();

        }

        return ret;

    }

}



class Pair{

    int x,y;

    Pair(int a,int b){

        x=a;

        y=b;

    }

}

 

 

 

 

文章標籤
全站熱搜
創作者介紹
創作者 En Chi Tsung 的頭像
En Chi Tsung

阿祁的部落格

En Chi Tsung 發表在 痞客邦 留言(0) 人氣(3)