携程笔试8.30

终于AK了一回

第三题代码
import java.util.*;

public class Main {

    public static int n;
    public static int[] pre;
    public static int[] total = new int[3];
    public static List<Integer>[] tree;
    public static Map<Integer, int[]>[] cntMap;
    public static String s;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        pre = new int[n];
        tree = new List[n];
        for (int i = 0; i < n; i++) {
            tree[i] = new ArrayList<>();
        }
        cntMap = new Map[n];
        for (int i = 0; i < n; i++) {
            cntMap[i] = new HashMap<>();
        }

        sc.nextLine();
        s = sc.nextLine();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            calc(total, c);
        }

        for (int i = 0; i < n-1; i++) {
            int u = sc.nextInt();
            int v = sc.nextInt();
            tree[u-1].add(v-1);
            tree[v-1].add(u-1);
            pre[u-1]++;
            pre[v-1]++;
        }

        initCntMap();
        System.out.println(solution());
    }

    private static int solution() {
        int res = 0;
        for (int i=0; i<n; ++i) {
            for (Map.Entry<Integer, int[]> entry : cntMap[i].entrySet()) {
                int[] cnt = entry.getValue();
                if (judge(cnt))
                    res++;
            }
        }
        return res;
    }

    private static void initCntMap() {
        Queue<Integer> q = new LinkedList<>();
        for (int i=0; i<n; ++i) {
            if (pre[i] == 1)
                q.offer(i);
        }
        while (!q.isEmpty()) {
            int u = q.poll();
            int[] cnt = new int[3];
            calc(cnt, s.charAt(u));
            int k = -1;
            for (int i = 0; i < tree[u].size(); i++) {
                int v = tree[u].get(i);
                pre[v]--;
                if (pre[v] == 1)
                    q.offer(v);
                if (cntMap[v].containsKey(u)) {
                    merge(cnt, cntMap[v].get(u));
                } else {
                    k = v;
                }
            }
            if (k >= 0)
                cntMap[u].put(k, cnt);
        }
    }

    private static void merge(int[] target, int[] other) {
        for (int i=0; i<3; ++i)
            target[i] += other[i];
    }

    private static void calc(int[] cnt, char c) {
        if (c == 'r')
            cnt[0]++;
        else if (c == 'g')
            cnt[1]++;
        else if (c == 'b')
            cnt[2]++;
    }

    private static boolean judge(int[] cnt) {
        for (int i=0; i<3; ++i) {
            if (cnt[i] == 0 || cnt[i] == total[i])
                return false;
        }
        return true;
    }
}


#携程笔试#
全部评论
有无大佬知道,第二题这种简单题为啥golang会超时,只能过80
1 回复 分享
发布于 2022-08-30 21:11 浙江
大佬第二题怎么做,能过用例但是通过率0
1 回复 分享
发布于 2022-08-30 21:11 江苏
三色树咋做呀,大佬
点赞 回复 分享
发布于 2022-08-30 20:58 上海
init_map没看懂,参数不对
点赞 回复 分享
发布于 2022-09-02 20:50 浙江

相关推荐

点赞 评论 收藏
分享
2 12 评论
分享
牛客网
牛客企业服务