zoukankan      html  css  js  c++  java
  • 区间问题-扫描线-前缀和-有序区间判重-1897. 会议室 3

    2020-04-18 22:21:06

    问题描述:

    你有一个当前会议列表intervals,里面表明了每个会议的开始和结束时间,以及一些会议室rooms。现在有一系列会议ask需要加入,逐个判断他们能否被安排进当前的会议列表中而不产生冲突。一个会议室在同一时间只能进行一场会议。每个询问都相互独立。

    样例

    例 1:

    输入:Intervals:[[1,2],[4,5],[8,10]],rooms = 1,ask: [[2,3],[3,4]]
    输出: [true,true]
    解释:
    对于[2,3]的询问,我们可以安排一个会议室room0。
    以下是room0的会议列表:
    [[1,2],[2,3],[4,5],[8,10]]
    对于[3,4]的询问,我们可以安排一个会议室room0。
    以下是room0的会议列表:
    [[1,2],[3,4],[4,5],[8,10]]
    

    例 2:

    输入:
    [[1,2],[4,5],[8,10]]
    1
    [[4,5],[5,6]]
    输出:
    [false,true]
    

    注意事项

    保证输入可以被安排在rooms个会议室之中
    保证任意一个会议的结束时间不大于50000
    |Intervals|<=50000
    |ask|<=50000
    rooms<=20

    问题求解:

    非常好的题目,巧妙的将区间判重和最大重叠区间问题结合了起来。

    时间复杂度:O(nlogn)

        public boolean[] meetingRoomIII(int[][] intervals, int rooms, int[][] ask) {
            Map<Integer, Integer> map = new HashMap<>();
            for (int[] inte : intervals) {
                map.put(inte[0], map.getOrDefault(inte[0], 0) + 1);
                map.put(inte[1], map.getOrDefault(inte[1], 0) - 1);
            }
            List<int[]> record = new ArrayList<>();
            for (int key : map.keySet()) record.add(new int[]{key, map.get(key)});
            Collections.sort(record, (o1, o2) -> Integer.compare(o1[0], o2[0]));
            List<int[]> pos = new ArrayList<>();
            int presum = 0;
            for (int i = 0; i < record.size(); i++) {
                presum += record.get(i)[1];
                if (presum == rooms) pos.add(new int[]{record.get(i)[0], record.get(i + 1)[0]});
            }
            boolean[] res = new boolean[ask.length];
            if (pos.size() == 0) {
                Arrays.fill(res, true);
                return res;
            }
            for (int i = 0; i < ask.length; i++) {
                int idx = helper(pos, ask[i]);
                if (idx != pos.size() && pos.get(idx)[0] < ask[i][1]) res[i] = false;
                else if (idx != 0 && pos.get(idx - 1)[1] > ask[i][0]) res[i] = false;
                else res[i] = true;
            }
            return res;
        }
    

      

  • 相关阅读:
    CF710F String Set Queries(AC自动机+二进制分组)
    P5231 [JSOI2012]玄武密码(AC自动机)
    AC自动机基础&应用
    [SDOI2011]计算器(快速幂,线性同余方程,BSGS)
    数论——欧拉定理和费马小定理
    AtCoder Beginner Contest 173 题解
    【CSP2019】树的重心(树的重心、倍增、换根)
    CF708C Centroids(换根dp,树的重心)
    凸包(Graham与Andrew算法求凸包)
    [USACO10MAR]Great Cow Gathering G(换根dp)
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/12728620.html
Copyright © 2011-2022 走看看