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),且:
将 ((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) 个双矩形的交,即:
看这个区域里是否存在点 ((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))。