CF538H Summer Dichotomy
CF538H Summer Dichotomy
题目大意
有 \(T\) 位学生报名了夏令营,主办方将从中选出至少 \(t\) 名学生参加,并将选出的人分为两组(允许某一组人数为空)。
有 \(n\) 位教师。每位教师会被分到其中一个组(允许某一组没有老师)。第 \(i\) 位教师要求他所在的组人数 \(\in[l_i, r_i]\)。
此外,有 \(m\) 对教师不能在同一组中。
你需要判断能否满足所有要求,如果可以,请给出一种方案。一种方案包含:两个组中学生的人数 \(n_1, n_2\),以及每位教师分别属于哪一组。
数据范围:\(1 \leq t\leq T\leq 10^9\),\(1\leq n\leq 10^5\),\(0\leq m\leq 10^5\),\(0\leq l_i\leq r_i\leq 10^9\)。
解法一
若一对教师不能在同一组中,则在它们之间连一条无向边。这样得到一张 \(n\) 个点、\(m\) 条边的无向图。如果这张图不是二分图,那么显然无解。否则设联通块数为 \(k\)。考虑每个连通块,它要么是一个孤点,要么被分为了左右两部分。对每个孤点,我们新建一个“万能教师”,它可以接受的人数是 \([0, \infty]\),令这个孤点和万能教师连边,这样最终孤点被分在哪个组,万能教师就会到另一个组,并不影响结果。现在,图中每个连通块都可以被分为左、右两侧,同侧的教师必须被分到同一组(但具体是哪一组还不确定,也就是说有 \(2^{k}\) 种分组的可能)。对每侧求出交集,记为 \([a_i, b_i]\),\([c_i, d_i]\)(\(i\) 是连通块的编号)。问题转化为求,是否存在一对 \((n_1, n_2)\),满足 \(t\leq n_1 + n_2\leq T\),且:
将 \((n_1, n_2)\) 看做二维坐标系里的一个点。定义 \(\mathrm{Rect}(x_1, x_2, y_1, y_2)\) 表示 \(x\in[x_1, x_2], y\in[y_1, y_2]\) 的点 \((x, y)\) 构成的矩形。定义一个“双矩形”图案,是指两个矩形的并。那么问题就是求 \(k\) 个双矩形的交,即:
看这个区域里是否存在点 \((x, y)\),满足 \(t\leq x + y\leq 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)\),满足 \(x\in[x_1, x_2], y\in[y_1, y_2]\),且 \(t\leq x + y\leq 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 + n\log 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\) 对限制)的。
证明,考虑三种情况:
- 若存在三段区间两两交为空,必定无解。
- 否则考虑右端点最小的区间和左端点最大的区间。如果这两个区间有交,即 \(L\leq R\),那么意味着所有区间的交就是 \([L, R]\)。令 \(n_1 = R, n_2 = L\) 时,所有教师都是“两组都能去”的,显然最有可能有解。
- 若 \(L > R\)。不妨设 \(n_1 \leq n_2\),那么必须要有:\(n_1\leq R\),\(n_2\geq L\)(否则有教师两组都去不了)。发现当 \(n_1\) 变小,能放进 \(n_1\) 这组的教师只会越来越少,所以 \(n_1\) 越大越好。同理,\(n_2\) 越小越好。所以令 \(n_1 = R, n_2 = L\) 是最有可能有解的。
下面加上 \(t, T\) 的要求。
- 如果 \(t\leq n_1 + n_2 \leq T\),什么都不用变。
- 如果 \(n_1 + n_2 < t\),那么 \(n_1 + n_2\) 要变大。根据前面的分析,只有 \(n_2\) 可以变大,且 \(n_2\) 是越小越好,所以令 \(n_2\gets 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)\)。