CF1400G Mercenaries
有 (n) 个人和 (m) 个敌对关系,第 (i) 个人有一个条件区间 ([l_i, r_i])
定义一种从 (n) 个人中选一个非空子集 (S) 的方案是合法的,当且仅当 (forall iin S, exists l_ileq|S|leq r_i) ,且 (S) 中的人互不敌对
求合法的选择方案 (mod 998244353) 的值
- (nleq3 imes10^5)
- (mleq20)
考虑 (m=0) 时的做法
枚举 (S) 的大小,记 (cnt_k=displaystylesum_{i=1}^n[l_ileq kleq r_i]) ,则答案等于 (displaystylesum_{i=1}^ndisplaystyleinom{cnt_i}i)
当 (m eq0) 时,考虑容斥
对于容斥集合 (T) ,找到存在于 (T) 的限制包含了哪些人,设人数为 (x) ,求出有多少种 (S) 的方案完全包含了这 (x) 个人,容斥系数为 ((-1)^{|T|})
求 (S) 方案数时,显然 (|S|) 的范围只能是这 (x) 个人的区间的交集 ([L, R]) ,且这 (x) 人必选,故答案为 (displaystylesum_{i=L}^Rinom{cnt_i-x}{i-x})
注意到 (x) 不会超过 (40) ,对每种 (x) 预处理组合数前缀和即可
一道题
给定一棵带边权树,第 (i) 个点有点权 (a_i)
记 (dis(u, v)) 为树上节点 (u) 到 (v) 的最短路边权之和
你可以从任意点出发,每次选择任意点作为目标,并沿最短路(边权和为 (k) )走到目标,你可以走任意步,在任意节点结束
定义一种方案的收益为,所有至少访问过一次的点的点权和,乘以整个过程中 (k) 的最小值
求得到的收益的最大值。
(nleq2 imes10^5)
假设树的直径之一是 ((x, y)) ,存在结论:距离树上每个点 (u) 最远的点之一,一定是 (x, y) 中较远的那一个
可以通过反证法证明
因此记 (d_i) 为节点 (i) 到树上距离它最远的点的距离
将所有点按 (d_i) 降序排序,记 (v_i=displaystylesum_{i=1}^na'_i) ,其中 (a'_i) 是以排序顺序为编号的点权
则答案为 (displaystylemax{v_i imes d_i}) ,即枚举 (k) 的最小值
CF1403B [CEOI2020] Spring cleaning
给定一棵 (n) 个点的树
按照如下方式定义一棵树的代价:
- 若该树有奇数个叶子,代价为 (-1)
- 否则将偶数个叶子两两匹配,定义一个匹配方案是合法的,当且仅当对于每条边都至少存在一个 (i) 满足匹配 ((x_i, y_i)) 的最短路包含了这条边。每个匹配 ((x_i, y_i)) 的代价为 (x_i, y_i) 在树上的最短路经过的边数,一种合法的匹配方案的代价即为每个匹配的代价之和,一棵树的代价为所有匹配方案中代价最小的那个
有 (q) 次询问,每次给定 (D_i) 个点(可以相同),给每个点增加一个叶子,求新树的代价,询问独立
(n, qleq10^5)
随意选一个非叶子节点 (rt) 作为根
记 (d_i) 为第 (i) 个点到 (rt) 经过的边数,一条边被经过的次数为由多少个匹配 ((x_i, y_i)) 的最短路上包含了这条边
对于两个叶子 (x, y) ,将它们匹配的代价为 (d_x+d_y-d_{lca(x, y)}) ,我们需要最大化 (d_{lca(x, y)})
考虑一个自底向上的过程,对于点 (u) ,已知它的所有儿子 (v) 的子树中,有哪些叶子(至少一个)还没在子树内部匹配
由于需要最大化 (d_{lca(u, v)}) ,我们会尽量将 (u) 子树中未匹配叶子放在 (u) 处匹配,而 (u) 向父亲的边又至少需要经过一次,因此 (u) 到父亲的边要么被经过一次,要么被经过两次,而经过两次的条件是, (u) 的子树内恰好有偶数个叶子
因此随便树剖或者虚树即可
另一种思考方式:
考虑从边的角度计算贡献
假设一条边被经过了两次以上
我们随意拿出经过它的匹配中的三个,假设为红黄绿
我们可以将黄绿部分重新匹配
但是可能会有这种情况,将黄绿路径重新匹配后,可能会有一些边不再被经过
但这个时候可以将红黄路径重新匹配,避免了该问题
因此得到结论:每条边至多被经过两次
我们的目标就是最小化被经过两次的边的数量
而这个时候再考虑之前自底向上的构造即可
CF1396D Rainbow Rectangles
一个 (L imes L) 的矩形上有 (n) 个点,有 (k) 种颜色,第 (i) 个点坐标为 ((X_i+1, Y_i+1)) ,颜色为 (C_i (1leq C_ileq k))
求有多少个以 ((r_1, c_1)) 为左上角, ((r_2, c_2)) 为右下角( (1leq r_1leq r_2leq L; 1leq c_1leq c_2leq L) )的子矩形满足,其中恰好包含了 (k) 种不同颜色的点至少一个
求答案(mod 10^9+7) ,保证不存在两个点的坐标相同
- (kleq nleq2 imes10^3)
- (Lleq10^9)
对于一维的情况,枚举右端点 (r) ,双指针找出最大的 (l) ,使得区间 ([l, r]) 满足条件,即可统计答案
先离散化,枚举矩形的 (r_2) ,考虑升序枚举 (r_1)
对于 (r_1=1) 时,套用一维的做法,对每个 (c_2) 求得最大的 (P_{c_2}) ,使得子矩形 ((r_1, P_{c_2}), (r_2, c_2)) 合法
当 (r_1) 转移时,考虑删掉 (X_i=r_1) 的点 (i) 会对 (P) 造成什么影响
找到 (C_i) 在 (Y_i) 的上一次出现位置 (pre) 和下一次出现位置 (nxt) ,对于所有 (jin[Y_i, nxt)) ,若 (P_jleq Y_i) ,则 (P_j) 需要对 (pre) 取 min,因为删掉了点 (i) 后区间 ([P_j, j]) 将不再有颜色 (C_i)
由于 (P_j) 是递增的,使用支持区间覆盖的线段树即可
时间复杂度 (O(n^2log n))
一道憨憨题
给定一张 (n) 个点 (m) 条边的有向图,找到一种给每个点一种染色的方案,使得对于每个点 (u) ,其所有出边 (v) 的颜色都相等,并且使用不同颜色数量尽量多
对于每个点 (u) 把它的出边用并查集缩到一起即可
瞎写一下
(V+F-E=2)
给定若干条线段,求平面被分割成了多少份,可用该式