专栏文章

题解:P9104 [PA 2020] Królewski bal

P9104题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min4rqbv
此快照首次捕获于
2025/12/01 20:33
3 个月前
此快照最后确认于
2025/12/01 20:33
3 个月前
查看原文
很明显这个图是二分图。
有结论:二分图最大匹配数=二分图最小点覆盖=总点数-二分图最大独立集点数。
考虑求出二分图最大独立集。
对于“最大独立集”,我们需要有以下的限制:
我们选择的“黑色点”以及“白色点”不能同时在一行或者一列。
这相当于我们钦定了“每一行”的颜色和“每一列”的颜色,然后只需要考虑交叉部分的颜色。
aia_i 表示第 ii 列有多少个白色节点,令 bib_i 表示第 ii 行有多少黑色节点,不妨先随便枚举集合 SS,如果 xSx \in S 表示我们选择了第 xx 列为白色。
然后我们考虑怎么样选择集合 TT(表示我们选择黑色的行),初始我们全部都选择白色,考虑增量对答案的贡献,这样我们取最大值就是我们想要的“最大独立集”。
现在考虑加入一行 yy,考虑第 xx 列的贡献,分类讨论:
  1. (x,y)(x,y) 为白,这一列不在 SS 中;
  2. (x,y)(x,y) 为黑,这一列不在 SS 中;
  3. (x,y)(x,y) 为白,这一列在 SS 中;
  4. (x,y)(x,y) 为黑,这一列在 SS 中。
仅有 22 类点和 33 类点会对答案造成贡献,22 类点有 +1+1 的贡献,33 类点有 1-1 的贡献。
WiW_i 表示第 ii 行在 SS 中有多少白色格子,BiB_i 表示第 ii 行在 SS 中有多少黑色格子,那么有 Wi+Bi=SW_i+B_i=S,贡献和为 (biBi)Wi=biS(b_i-B_i)-W_i=b_i-|S|
所以 SS 的具体取值并不会影响最终的答案,我们记 x=Sx=|S|,那么对于固定的 xx 的答案就是,i=1xAi+i=1nmax(0,bix)\sum\limits_{i=1}^x A_i+\sum\limits_{i=1}^n\max(0,b_i-x),定义 AiA_iaia_i 从大到小排序后的数组。
可以定义函数 F(x)=i=1xAi+i=1nmax(0,bix)F(x)=\sum\limits_{i=1}^x A_i+\sum\limits_{i=1}^n\max(0,b_i-x)。我们仅需要快速求出 ai,bia_i,b_i 以及维护单点修改就行,询问实际上就是 n2maxi=0nF(i)n^2-\max\limits_{i=\color{red}{0}}^n F(i)
快速求出 ai,bia_i,b_i 可以扫描线。维护一个线段树支持区间翻转,区间求 11 或者 00 的个数的线段树就行。
维护这个函数,也需要考虑线段树,维护区间修改,全局查最大值。
可以分别考虑 ai,bia_i,b_i 的变化,由于 ai,bia_i,b_i 仅能 ±1\pm 1,可以考虑 ai,bia_i,b_i 的贡献区间。
对于一个 bib_i 来讲,其实能够贡献的 xx[0,bi1][0,b_i-1] 中。当 bib_i 变化的时候,在对应区间 ±1\pm 1 即可。
对于一个 aia_i 来讲,其实 ±1\pm 1 相当于改变了这个数在原数组中对应的位置,可以维护每一个值 xx 在线段树上对应的区间 lx,rxl_x,r_x。当 aia_i11 时,aia_i 会向左移,令 xx 为原来的 aia_i,可以让 lxl_x 加一,rx+1r_{x+1} 加一。那么 aia_i 向右移的情况是一样的。
时间复杂度 O(nlogn)O(n \log n)

评论

0 条评论,欢迎与作者交流。

正在加载评论...