首页 > 其他分享 >【leetcode 952. 按公因数计算最大组件大小】【欧拉筛+并查集】

【leetcode 952. 按公因数计算最大组件大小】【欧拉筛+并查集】

时间:2022-11-02 22:24:21浏览次数:56  
标签:tmp p2 952 int 查集 rank fa set0 公因数

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Solution {
    List<Integer> list = new ArrayList<>();
    int primeNum = 0;
    int[] fa;
    int[] rank;
    int[] map ;

    public static void main(String[] args) {
        Solution solution = new Solution();
        int cnt = solution.largestComponentSize(new int[]{
                12377,95569,53366,10979,43909,40213,22501,359,96269,82847,85829,81154,43423,2801,97049,30053,72049,84779,17659,34033,49663,10159,61283,91771,22153,93991,8779,10357,89213,2791,55465,21061,9017,44777,77876,67343,64661,28631,20107,23557,10201,86737,4534,31481,83761,8977,59743,3659,4479,42577,2011,94063,59233,69777,31957,4909,82633,70709,72977,52973,74216,93109,37328,5591,77323,91857,36259,42743,76739,94697,88339,14801,39982,59473,26153,75689,55201,12293,14669,94819,36545,33403,16183,809,12451,20602,52354,54476,51421,53267,25589,45869,13829,90821,37547,52951,80943,33329,48989,11483,21548,75323,32987,51503,16987,89911,54589,74821,25763,34283,23977,46589,87023,36979,40057,43159,12763,29339,41521,85823,57029,69259,18119,27947,97561,54669,63377,69739,72367,27793,57373,79757,30187,83,83089,47527,69899,43786,26951,84278,36721,58207,81773,60283,79641,29483,87797,76313,30236,54359,16007,99371,44501,42649,14673,95789,31907,66049,93745,93985,4591,12813,5813,89767,41045,3607
        });
        System.out.println(cnt);
    }

    public int largestComponentSize(int[] nums) {
        pre();
        int cnt1 = 0;
        for (int num : nums) {
            int tmp = num;
            if( num == 1){
                cnt1=1;
                continue;
            }
            List<Integer> primes = new ArrayList<>();
            for (int i = 0; i < primeNum && list.get(i) <= tmp && map[tmp] == -1; i++) {
                int p = list.get(i);
                boolean find = false;
                while (tmp % p == 0) {
                    tmp = tmp / p;
                    find = true;
                }
                if (find) {
                    primes.add(i);
                }
            }
            int set0 = map[tmp]>-1?map[tmp]:primes.get(0);
            rank[find(set0)]++;
            for (int j = 0; j < primes.size(); j++) {
                int set = primes.get(j);
                merge(set0, set);
            }

        }
        int max = 0;
        for (int i = 0; i < list.size(); i++) {
            int p = find(i);
            if (rank[p] > max) {
                max = rank[p];
            }
        }
        return Math.max(max,1);
    }

    public void merge(int set0, int set1) {
        int p1 = find(set0);
        int p2 = find(set1);

        if (p1 == p2) {
            return;
        }

        if (rank[p1] > rank[p2]) {
            fa[p2] = p1;
            rank[p1] += rank[p2];
        } else {
            fa[p1] = p2;
            rank[p2] += rank[p1];
        }

    }

    public int find(int set0) {
        int tmp = set0;
        while (fa[tmp] != tmp) {
            tmp = fa[tmp];
        }
        int root = tmp;
        while(fa[set0] != set0){
            int p = fa[set0];
            fa[set0] = root;
            set0 = p;
        }
        return root;
    }

    public void pre() {
        primeNum = 0;
        Arrays.fill(isprime,true);
        for (int i = 2; i <= 100000; i++) {
            if (isprime[i]) {
                primeNum++;
                list.add(i);
            }
            for(int j=i;j<=1_000_00;j+=i){
                isprime[j] = false;
            }
            isprime[i] = true;
        }
        //        System.out.println(primeNum);
        fa = new int[primeNum];
        rank = new int[primeNum];
        for (int i = 0; i < primeNum; i++) {
            fa[i] = i;
            rank[i] = 0;
        }
        map = new int[100001];
        Arrays.fill(map,-1);
        for(int i = 0;i<list.size();i++){
            map[list.get(i)] = i;
        }

    }

    boolean[] isprime = new boolean[100001];
}

 

标签:tmp,p2,952,int,查集,rank,fa,set0,公因数
From: https://www.cnblogs.com/fishcanfly/p/16852747.html

相关文章

  • 如何使用并查集解决朋友圈问题?
    本文已收录到 GitHub·AndroidFamily,有Android进阶知识体系,欢迎Star。技术和职场问题,请关注公众号[彭旭锐]私信我提问。前言大家好,我是小彭。今天分享到的是......
  • 【XSY4055】小K的疑惑(模拟最短路,值域并查集)
    题面小K的疑惑题解以下的数都是在\(b\)进制意义下讨论。默认\(n\geqb\),否则\(n<b\)可以特判答案为\(1\)。考虑DP,设\(d_r\)表示所有模\(n\)余\(r\)的正......
  • 普及-的并查集(都是板子)
        #include<bits/stdc++.h>usingnamespacestd;constintN=1e5+7;structNode{ intbn,ed,t;}a[N];intf[N];intfind(intx){returnx==f[x]?x:......
  • 【XSY2485】MST(最小生成树+倍增lca+并查集)
    题面Description给定一个\(n\)个点\(m\)条边的连通图,保证没有自环和重边。对于每条边求出,在其他边权值不变的情况下,它能取的最大权值,使得这条边在连通图的所有最小生成......
  • 【bzoj4358】permu【XSY1535】seq(莫队+并查集)
    考虑莫队,但是我们发现这个东东只支持\(ins\)(至于怎么支持等会再讲),不支持\(del\)操作,所以我们构造一种只\(ins\)不\(del\)的莫队。由于我们按莫队的方法排序,第一关键字为\(......
  • 并查集--翻译机的个数(顺丰2020年笔试)
    某学术会议上,一共有n个人参加,现在已知每个人会的语言(一个人可能不会任何语言)。现在有一种学习机,每一个学习机可以在会议期间使一个人暂时掌握一种自己不会的语言,问要使得任......
  • 并查集--村村通
    题目描述某市调查城镇交通状况,得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府“村村通工程”的目标是使全市任何两个城镇间都可以实现交通(但不一定有直......
  • 并查集--同时修路得到的最短时间
    题目背景AA地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车。政府派人修复这些公路。题目描述给出A地区的村庄数NN,和公路数MM,公路是双向的。并告诉你每条公路的连......
  • ACWing - 4493 -- 思维题&&并查集&&dfs
    题目描述环形连通分量思路对于一个无向图中的简单环(环中边的数量等于点的数量),有一个很强的性质:每个点的度数等于\(2\)。那么我们只需要先找出所有的连通块,然后判......
  • MST算法-堆优化Prim与并查集优化Kruskal
    生成树首先,生成树是相对于连通图来说的。它是一个连通图的子图,而且没有环,也可以看成是一棵树。对于生成树,其所有结点的根节点都是同一个。生成树有以下两个性质:生成树......