杂题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\)

给定若干条线段,求平面被分割成了多少份,可用该式

posted @ 2020-09-06 00:43  cnJuanzhang  阅读(185)  评论(0编辑  收藏  举报