zoukankan      html  css  js  c++  java
  • CF538H Summer Dichotomy

    CF538H Summer Dichotomy

    题目大意

    题目链接

    (T) 位学生报名了夏令营,主办方将从中选出至少 (t) 名学生参加,并将选出的人分为两组(允许某一组人数为空)。

    (n) 位教师。每位教师会被分到其中一个组(允许某一组没有老师)。第 (i) 位教师要求他所在的组人数 (in[l_i, r_i])

    此外,有 (m) 对教师不能在同一组中。

    你需要判断能否满足所有要求,如果可以,请给出一种方案。一种方案包含:两个组中学生的人数 (n_1, n_2),以及每位教师分别属于哪一组。

    数据范围:(1 leq tleq Tleq 10^9)(1leq nleq 10^5)(0leq mleq 10^5)(0leq l_ileq r_ileq 10^9)

    解法一

    若一对教师不能在同一组中,则在它们之间连一条无向边。这样得到一张 (n) 个点、(m) 条边的无向图。如果这张图不是二分图,那么显然无解。否则设联通块数为 (k)。考虑每个连通块,它要么是一个孤点,要么被分为了左右两部分。对每个孤点,我们新建一个“万能教师”,它可以接受的人数是 ([0, infty]),令这个孤点和万能教师连边,这样最终孤点被分在哪个组,万能教师就会到另一个组,并不影响结果。现在,图中每个连通块都可以被分为左、右两侧,同侧的教师必须被分到同一组(但具体是哪一组还不确定,也就是说有 (2^{k}) 种分组的可能)。对每侧求出交集,记为 ([a_i, b_i])([c_i, d_i])(i) 是连通块的编号)。问题转化为求,是否存在一对 ((n_1, n_2)),满足 (tleq n_1 + n_2leq T),且:

    [forall 1leq ileq k: (n_1in[a_i, b_i]operatorname{and}n_2in[c_i, d_i]) operatorname{or}(n_1in[c_i, d_i]operatorname{and}n_2in[a_i, b_i]) ]

    ((n_1, n_2)) 看做二维坐标系里的一个点。定义 (mathrm{Rect}(x_1, x_2, y_1, y_2)) 表示 (xin[x_1, x_2], yin[y_1, y_2]) 的点 ((x, y)) 构成的矩形。定义一个“双矩形”图案,是指两个矩形的并。那么问题就是求 (k) 个双矩形的交,即:

    [igcap_{i = 1}^{k} ig(mathrm{Rect}(a_i, b_i, c_i, d_i)cupmathrm{Rect}(c_i, d_i, a_i, b_i)ig) ]

    看这个区域里是否存在点 ((x, y)),满足 (tleq x + yleq T)

    给二维平面里每个点设置一个点权,初始时所有点点权都是 (0)。然后令每个双矩形覆盖到的区域里,点权 (+1)。那么我们要求的就是点权为 (k) 的区域。具体来说,对于一个双矩形,如果它的两个矩形交为空,那么直接当成两个矩形分别做二维区域加;否则把它拆成三个矩形,对两个矩形做二维区域 (+1),对它们的交集(也是一个矩形)做二维区域 (-1)。问题进一步转化为,有 (mathcal{O}(n)) 个矩形,每个矩形有一个权值((+1)(-1)),求出权值和等于 (k) 的区域。用扫描线扫描这些矩形,用线段树支持区间加、区间最大值查询即可。

    如果找到了一个区域权值等于 (k),我们要判断其中是否有点满足学生人数的限制。具体来说,设区域为 (mathrm{Rect}(x_1, x_2, y_1, y_2)),那么要判断是否存在点 ((x, y)),满足 (xin[x_1, x_2], yin[y_1, y_2]),且 (tleq x + yleq T)。区域里 (x + y) 最小的点是 (x_1 +y_1),最大的点是 (x_2 + y_2),这中间的整数显然都能取到,所以直接判断 ([x_1 + y_1, x_2 + y_2])([t, T]) 是否有交即可(可以 (mathcal{O}(1)) 判断)。若有交,相当于已经求出了答案。

    但在扫描时,如果对同一段 (x)(我们按 (x) 从左往右扫),有多个不连通的矩形区域权值都等于 (k),我们每个都要判断一下,时间复杂度可能就不对了。其实这种情况不会出现。因为我们的 (k) 个双矩形,都是关于直线 (x = y) 对称的,所以任意一个 (x) 坐标对应的竖线,它和某个双矩形的交,要么是空,要么是一条线段,也就是 (y) 坐标上连续的一段。所以每个 (x) 不可能带来多段权值等于 (k) 的区域。

    至此我们在 (mathcal{O}(m + nlog n)) 的时间复杂度内解决了本题。

    解法二

    考虑如果确定了 (n_1, n_2),那么问题转化为,有些教师只能放进 (n_1) 这组,有些教师只能放进 (n_2) 这组,有些教师两组都可以。要求分配这些教师,使得满足 (m) 对限制。跑一个二分图染色,就能判断是否有解了。

    (L = max{l_i})(R = min{r_i})

    有结论:如果忽略 (t, T) 的要求,那么令 (n_1 = R, n_2 = L),是最有可能有解(满足所有 (m) 对限制)的。

    证明,考虑三种情况:

    • 若存在三段区间两两交为空,必定无解。
    • 否则考虑右端点最小的区间和左端点最大的区间。如果这两个区间有交,即 (Lleq R),那么意味着所有区间的交就是 ([L, R])。令 (n_1 = R, n_2 = L) 时,所有教师都是“两组都能去”的,显然最有可能有解。
    • (L > R)。不妨设 (n_1 leq n_2),那么必须要有:(n_1leq R)(n_2geq L)(否则有教师两组都去不了)。发现当 (n_1) 变小,能放进 (n_1) 这组的教师只会越来越少,所以 (n_1) 越大越好。同理,(n_2) 越小越好。所以令 (n_1 = R, n_2 = L) 是最有可能有解的。

    下面加上 (t, T) 的要求。

    • 如果 (tleq n_1 + n_2 leq T),什么都不用变。
    • 如果 (n_1 + n_2 < t),那么 (n_1 + n_2) 要变大。根据前面的分析,只有 (n_2) 可以变大,且 (n_2) 是越小越好,所以令 (n_2gets t - n_1) 即可。
    • 如果 (n_1 + n_2 > T),那么 (n_1 + n_2) 要变小。根据前面的分析,只有 (n_1) 可以变小,且 (n_1) 是越大越好,所以令 (n_1 gets T - n_2) 即可。

    现在确定了 (n_1, n_2)。像前面说的一样,跑一遍二分图染色即可。

    时间复杂度 (mathcal{O}(n + m))

  • 相关阅读:
    .Net Attribute详解(下)
    .Net Attribute详解(上)-Attribute本质以及一个简单示例
    美国快递跟踪链接
    ffmpeg中AVBuffer的实现分析
    Android Studio创建JAR/AAR库
    Android Studio添加原生库并自动构建
    代码注释中的专有词——TODO、FIXME和XXX
    adb获得安卓系统版本及截屏
    FFmpeg libavutil主要功能概述
    Linux下库打桩机制分析 function Interposition
  • 原文地址:https://www.cnblogs.com/dysyn1314/p/cf538h.html
Copyright © 2011-2022 走看看