杂题20200906
CF1400G Mercenaries
有 \(n\) 个人和 \(m\) 个敌对关系,第 \(i\) 个人有一个条件区间 \([l_i,\ r_i]\)
定义一种从 \(n\) 个人中选一个非空子集 \(S\) 的方案是合法的,当且仅当 \(\forall\ i\in S,\ \exists\ l_i\leq|S|\leq r_i\) ,且 \(S\) 中的人互不敌对
求合法的选择方案 \(\bmod 998244353\) 的值
- \(n\leq3\times10^5\)
- \(m\leq20\)
考虑 \(m=0\) 时的做法
枚举 \(S\) 的大小,记 \(cnt_k=\displaystyle\sum_{i=1}^n[l_i\leq k\leq r_i]\) ,则答案等于 \(\displaystyle\sum_{i=1}^n\displaystyle\binom{cnt_i}i\)
当 \(m\neq0\) 时,考虑容斥
对于容斥集合 \(T\) ,找到存在于 \(T\) 的限制包含了哪些人,设人数为 \(x\) ,求出有多少种 \(S\) 的方案完全包含了这 \(x\) 个人,容斥系数为 \((-1)^{|T|}\)
求 \(S\) 方案数时,显然 \(|S|\) 的范围只能是这 \(x\) 个人的区间的交集 \([L,\ R]\) ,且这 \(x\) 人必选,故答案为 \(\displaystyle\sum_{i=L}^R\binom{cnt_i-x}{i-x}\)
注意到 \(x\) 不会超过 \(40\) ,对每种 \(x\) 预处理组合数前缀和即可
一道题
给定一棵带边权树,第 \(i\) 个点有点权 \(a_i\)
记 \(dis(u,\ v)\) 为树上节点 \(u\) 到 \(v\) 的最短路边权之和
你可以从任意点出发,每次选择任意点作为目标,并沿最短路(边权和为 \(k\) )走到目标,你可以走任意步,在任意节点结束
定义一种方案的收益为,所有至少访问过一次的点的点权和,乘以整个过程中 \(k\) 的最小值
求得到的收益的最大值。
\(n\leq2\times10^5\)
假设树的直径之一是 \((x,\ y)\) ,存在结论:距离树上每个点 \(u\) 最远的点之一,一定是 \(x,\ y\) 中较远的那一个
可以通过反证法证明
因此记 \(d_i\) 为节点 \(i\) 到树上距离它最远的点的距离
将所有点按 \(d_i\) 降序排序,记 \(v_i=\displaystyle\sum_{i=1}^na'_i\) ,其中 \(a'_i\) 是以排序顺序为编号的点权
则答案为 \(\displaystyle\max\{v_i\times 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,\ q\leq10^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\times L\) 的矩形上有 \(n\) 个点,有 \(k\) 种颜色,第 \(i\) 个点坐标为 \((X_i+1,\ Y_i+1)\) ,颜色为 \(C_i\ (1\leq C_i\leq k)\)
求有多少个以 \((r_1,\ c_1)\) 为左上角, \((r_2,\ c_2)\) 为右下角( \(1\leq r_1\leq r_2\leq L;\ 1\leq c_1\leq c_2\leq L\) )的子矩形满足,其中恰好包含了 \(k\) 种不同颜色的点至少一个
求答案\(\bmod 10^9+7\) ,保证不存在两个点的坐标相同
- \(k\leq n\leq2\times10^3\)
- \(L\leq10^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\) ,对于所有 \(j\in[Y_i,\ nxt)\) ,若 \(P_j\leq Y_i\) ,则 \(P_j\) 需要对 \(pre\) 取 min,因为删掉了点 \(i\) 后区间 \([P_j,\ j]\) 将不再有颜色 \(C_i\)
由于 \(P_j\) 是递增的,使用支持区间覆盖的线段树即可
时间复杂度 \(O(n^2\log n)\)
一道憨憨题
给定一张 \(n\) 个点 \(m\) 条边的有向图,找到一种给每个点一种染色的方案,使得对于每个点 \(u\) ,其所有出边 \(v\) 的颜色都相等,并且使用不同颜色数量尽量多
对于每个点 \(u\) 把它的出边用并查集缩到一起即可
瞎写一下
\(V+F-E=2\)
给定若干条线段,求平面被分割成了多少份,可用该式