D
先把所有区间按 (r) 排序,设 (S_i) 为与第 (i) 个区间相交的区间的集合(包括 (i)),那么我们可以把这些区间分为 (4) 类:
- (S_i) 中除了 (0) 之外有不止一种颜色。
- (S_i) 中只有一种不为 (0) 的颜色。
- (S_i) 中除了 (0) 之外只有一种颜色。
- (S_i) 中只有 (0) 这一种颜色。
其中第一种对答案必然没有贡献,第二种对答案必然有贡献,所以我们只统计后两种。
考虑 (S_i) 包含了哪些区间,令 (f_i = min{j mid r_j ge l_i}),则 (j in S_i iff f_i le j le i vee f_j le i le j)。
当我们硬点了区间 (i) 对答案有贡献的时候,会影响到满足 (S_i cap S_j eq varnothing) 的所有区间 (j),考虑在什么情况下这个条件被满足(不妨设 (i < j)):
- 存在 (k),满足 (f_i le k le i wedge f_j le k le j),即 (max(f_i, f_j) le k le i)。
- 存在 (k),满足 (f_k le i le k wedge f_j le k le j),即 (f_k le i wedge max(i, f_j) le k le j)。
- 存在 (k),满足 (f_k le i le k wedge f_k le j le k),即 (f_k le i wedge j le k)。
即存在 (k),满足 (f_k le i wedge max(f_i,f_j) le k),又 (f_j le i) 时条件 1 必然满足,故令 (s_i = min_{j ge i}f_j),则 (S_i cap S_j eq varnothing iff min(s_{f_j},f_j) le i)。
那么设 (d_i) 为只考虑前 (i) 个区间的时候的答案,转移的话先枚举第 (i) 个区间的颜色,然后考虑在不影响前 (j) 个区间的情况下 ([j + 1, i]) 中最多能选多少个区间即可,时间复杂度 (O(n ^ 2 C))。
I
从小到大排序,在固定选 (k) 个的情况下考虑堆扩展。
首先从选最小的 (k) 个开始,对于每个状态维护一个三元组 ((c, p, l, 0/1)),表示当前指针指向第 (c) 小的数,这个数位置是 (p),上一个数的位置是 (l),最后的 (0/1) 表示能否统计进答案。
转移有两种,将 (p) 加上 (1) 或将 (p) 加上 (1) 之后将 (c) 减 (1),其中第二种转移不可统计进答案。
这样的话这 (k) 个数的每个位置集合都只会被统计至多两次,而且显然不会漏掉状态,于是我们就解决了这个问题。
K
网络流。
考虑普通投影仪的分配,可以求出每个时刻至多有多少个普通投影仪可以闲置,这是一种边。另一种边是一个研讨会使用了一个普通投影仪,这是另一种边。跑最大流看最后是否满流即可。
M
把这个网格看成一个二分图,则每次操作相当于将左部的某个集合 ({x}) 和右部的某个集合 ({y}) 的所有元素之间连上边,同时要满足最后连的边中不能存在 ((x_L, y_R)) 满足 (x = y) 或 (x = y + 1),而其他边全部存在。
先考虑左部中标号为偶数的节点,可以发现它们与右部中与它们除了最后一个二进制位之外的位不同的点都有连边,这可以用二进制分组解决。标号为奇数的点位移之后可以使用同样的构造。
操作次数 (4(lceil log_2n ceil - 1))。