淘天 4.10 笔试

是不是我审题的问题,第一题暴力只能过0.09,40分钟死磕第三题只过了0.06,第三题到底该怎么做啊

我好像是这么写的,没法调试,也没有记录

import java.util.*;


public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int m = scan.nextInt();
        UF uf = new UF(n);
        int u,v;
        StringBuilder ans = new StringBuilder();
        for (int i = 0; i < m; i++) {
            u = scan.nextInt();
            v = scan.nextInt();
            if(uf.union(u,v)) ans.append("Yes");
            else ans.append("No");
            ans.append('\n');
        }
        System.out.println(ans);
    }


}
class UF {
    private int count;
    private int[] parent;
    private int[] size;
    Set<Long> set;//记录重边
    boolean[] dup;//记录重边集合
    boolean[]circle;//记录有环的集合
    public UF(int n) {
        this.count = n;
        parent = new int[n];
        size = new int[n];
        circle = new boolean[n];
        dup = new boolean[n];
        for (int i = 0; i < n; i++) {
            parent[i] = i;
            size[i] = 1;
        }
    }


    public boolean union(int p, int q) {
        int rootP = find(p);
        int rootQ = find(q);
        boolean d = set.contains(pair(p,q))||set.contains(pair(q,p))||p ==q;//重边或者自环就不能是
        set.add(pair(p,q));
        set.add(pair(q,p));
        dup[rootP] = d;
        dup[rootQ] = d;
        if (rootP == rootQ) {
            circle[rootP] = true;
            return !dup[rootP];
        }
        // 平衡性优化
        if (size[rootP] < size[rootQ]) {
            parent[rootP] = rootQ;
            size[rootQ] += size[rootP];
        } else {
            parent[rootQ] = rootP;
            size[rootP] += size[rootQ];
        }
        return (circle[rootP]||circle[rootQ])&&!(dup[rootP]||dup[rootQ]);
    }
    private int find(int x) {
        if (parent[x] != x) {
            parent[x] = find(parent[x]);
        }
        return parent[x];
    }
    private long pair(int x,int y){
        return ((long)x<<32)+y;
    }




}



全部评论
想起来我pair好像没把x强转long,牛客的编辑器好像不会像idea一样黄标提示
点赞 回复
分享
发布于 04-11 16:36 山东

相关推荐

JAVA工程岗位,A了0.1/3,我真佩服我自己————编程题————第一题:一个数组的权值=它的众数的数值,现在有一个数组,它有n个数,选择k个数,并且使得权值最大个人思路:假设有一个数组[2,3,5,3,3,3,5,5],k=7这时候权值是5,排序,统计频次,5是肯定要选的,尽可能分散剩下的数,让5保持自己是众数的地位;之外,剩下的数按照从大到小每次选1个[5,5,5,3,2](重复流程)->[5,5,5,3,2,3,2],到k需要统计一下新的频次第二题:ai&nbsp;=&nbsp;ai+1&nbsp;mod&nbsp;i,一个数组的前n个序列都满足这个条件;现在给定第n+1个数字,n的个数,计算第k个值第三题:一个基环树,定义是不包含重复边和自环,且连通;给你点的个数和边的个数,以及哪些边,判断这个树是否是基环树————选择题,未标都是单选————你需要完成用户都在玩游戏的时候,给他们一个世界通知,应该采用什么模式?需要给file.txt设置权限:用户权限rwx,组权限rx,其他只有r权限物理数据库设计需要考虑什么WebSocket建立与server的连接,需要使用什么方法?(选项有:OPEN\CONNECT之类的)适合递归实现的排序算法是?有个图,边是这些,求普利姆算法的遍历的边的顺序:AB4,AC3,AD6,BC5,BE7,EH9,DG8,CF2,FG1【多选】行为型模式有哪些【多选】下列哪些是二分查找的比较序列【多选】文件的保护方法有?选项:存储控制表、存储控制矩阵、口令、加密【多选】IP协议?选项:面向连接、提供可靠传输、不同步传输、尽可能保持数据交付【多选】二叉搜索树的完全二叉树遍历序列?选项:35&nbsp;5&nbsp;7&nbsp;3&nbsp;1&nbsp;9&nbsp;4,5&nbsp;3&nbsp;9&nbsp;1&nbsp;4&nbsp;7&nbsp;35,6&nbsp;3&nbsp;10&nbsp;1&nbsp;5&nbsp;7&nbsp;25,2&nbsp;1&nbsp;3&nbsp;&nbsp;4&nbsp;5&nbsp;6&nbsp;7&nbsp;【多选】Linux&nbsp;Shell定义数组代码【多选】数据库事务特性:经典ACID【JAVA单选】类加载器,选项是:预加载所有类;发现类被加载之后,防止过期重新加载;可以自定义类加载器;类加载器有四种,启动、扩展、应用、自定义,且它们是父子关系【JAVA多选】静态相关,选项是:static修饰成员静态方法和变量;它与类本身相关联,在类加载的时候初始化;static的方法只在类加载的时候执行一次;静态方法可以访问非静态资源
投递淘天集团等公司10个岗位
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务