专栏文章

【咕】2025 Beijing WC (CNUHS) B

生活·游记参与者 1已保存评论 0

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@miqc8elj
此快照首次捕获于
2025/12/04 02:26
3 个月前
此快照最后确认于
2025/12/04 02:26
3 个月前
查看原文

2025/02/05 (贪心 凸性 拟阵)

nn 个区间,选出尽可能多个两两不交的区间。
n5×104n\le5\times10^4
按右端点从小到大排序,依次考虑每一个区间,能选则选。复杂度 O(nlogn)\mathcal{O}(n\log n)

实现来自 AzusidNya,拜谢。
nn 个区间,选出尽可能少个区间覆盖 1m1\sim m
n105n\le10^5
按左端点从小到大排序,每次选出最长前缀。具体实现相当于每次求 lxl\le x 的最大的 rr,因此不妨把右端点挂到左端点上,维护前缀最大值即可。有较多细节。复杂度 O(nlogn)\mathcal{O}(n\log n)

* 区间选择模型 III。
nn 个点 mm 个区间,选出尽可能少个点覆盖所有区间。
n,m106n,m\le10^6
去掉所有包含其他区间的区间。区间按左端点从小到大排序。从小到大依次考虑每一个点,能不选则不选。复杂度 O(nlogn)\mathcal{O}(n\log n)

* 前缀匹配模型。
n+mn+m 个点的二分图,左侧第 ii 个点与右侧第 1pi1\sim p_i 个点连边。求最大匹配。
n106n\le10^6
以任意顺序考虑左侧第 ii 个点,选择右侧 pip_i 之前编号最大的未匹配点与之匹配。复杂度 O(nlogn)\mathcal{O}(n\log n)

* 区间匹配模型。
n+mn+m 个点的二分图,左侧第 ii 个点与右侧第 liril_i\sim r_i 个点连边。求最大匹配。
n,m106n,m\le10^6
从小到大考虑右侧每一个点,选择左侧能与之匹配的点中 rir_i 最小的点进行匹配。复杂度 O(nlogn)\mathcal{O}(n\log n)

* 二维前缀匹配模型。
n+mn+m 个点的二分图,左侧第 ii 个点与右侧第 jj 个点连边,其中 jj 满足 xjaix_j\le a_iyjbiy_j\le b_i。求最大匹配。
n106n\le10^6
xx 坐标扫描线,扫到右侧点时加入按 yy 排序的 multiset,扫到左侧点时选择能匹配的 yy 最大的右侧点。复杂度 O(nlogn)\mathcal{O}(n\log n)

* 带点权前缀匹配模型。
n+mn+m 个点的二分图,左侧第 ii 个点与右侧第 1pi1\sim p_i 个点连边。右侧点有点权 aja_j。求点权和最大的匹配。
n106n\le10^6
按点权从大到小考虑右侧每一个点,选择左侧能与之匹配的 pip_i 最小的点与之匹配。复杂度 O(nlogn)\mathcal{O}(n\log n)

邻项交换模型。
给定 nn 个 01 序列 aia_i,将他们以任意顺序拼接,最小化逆序对数。
n106n\le10^6
考虑何时交换相邻两段更优。令 s0(i)s_0(i) 表示 aia_i 中 0 的个数,s1(i)s_1(i) 同理。
发现交换只影响两段之间的逆序对,段内部的逆序对仍然存在。因此,当且仅当 s1(i)×s0(i+1)>s1(i+1)×s0(i)s_1(i)\times s_0(i+1)>s_1(i+1)\times s_0(i) 交换更优。变形得 s1(i)s0(i)>s1(i+1)s0(i+1)\frac{s_1(i)}{s_0(i)}>\frac{s_1(i+1)}{s_0(i+1)}。不妨按 s1(i)s0(i)\frac{s_1(i)}{s_0(i)} 从小到大排序即可。

nn 个点的有根树,有点权 ai{0,1}a_i\in\{0,1\}。每次可以选择没有父亲的点删除,并且其点权加入序列末尾。最小化序列逆序对数。
n2×105n\le2\times10^5
不妨扩展成点权为 01 序列。由上题结论,对于当前全局 s1(i)s0(i)\frac{s_1(i)}{s_0(i)} 最小的点 xx,一定会在父亲被删除后立即被删除。因此,不妨将其与其父亲合并。如此不断合并,当只剩一个点时即可得到答案。用堆和并查集维护。复杂度 O(nlogn)\mathcal{O}(n\log n)

* 最小化字典序模型。

CF626G Raffles,*3100。
nn 个奖池,第 ii 个奖池的奖金是 pip_i,其他人已押入 lil_i 张彩票。
tt 张彩票,将彩票分配到这些奖池中,需要保证你在第 ii 个奖池中押入的彩票数 tit_i 不能超过 lil_i。对于第 ii 个奖池,中奖概率为 titi+li\frac{t_i}{t_i + l_i}。若中奖,则获得这个奖池的全部奖金 pip_i
qq 次事件,每次事件会使某个 lil_i11 或减 11。询问在最佳分配方案下获得的奖金总数的最大期望值。
n,t,q2×105n,t,q\le2\times10^5pi,li103p_i,l_i\le 10^3,答案精度误差 106\le10^{-6}
对于每个奖池,注意到 fi(x)=xx+lipif_i(x)=\frac x{x+l_i}\cdot p_i 是凸的,因此答案即为这 nn 个凸函数 (min,+)(\min,+) 卷积的第 tt 项。
对于一组询问,只需用堆维护每一个奖池多放一张期望的增量,模拟贪心即可。复杂度 O(qn)\mathcal{O(q\cdot n)}
* 可以证明,每次修改后 tit_i 至多只会变化 11。因此,用堆维护已经放置的彩票中期望增量的最小值和能够放置的最大值即可。复杂度 O((q+n)logn)\mathcal{O}((q+n)\log n)

题意较复杂,不多赘述。
* 一组询问实际上就是最大权匹配模型,按顺序交错排列这些菜即可转化为后缀匹配,可贪心的从后向前考虑每一天,售出当前价格最高的蔬菜。

思路来自 gcz,拜谢。
nn 个二元组 (vi,wi)(v_i,w_i)。对于正整数 ss,执行操作:
  • 对于每个二元组,记 fi(s)f_i(s) 表示二进制下的 s bitand wis\text{ bitand }w_i11 的个数,则令 vi(1)fi(s)viv_i\gets(-1)^{f_i(s)}\cdot v_i
构造 ss,使得操作前后 vi\sum v_i 符号相反。
n3×105n\le3\times10^5
不妨令 vi\sum v_i 初始为正。如果为负,将 viv_i 全部取反是等价的。设 anss\text{ans}_s 表示选定 ss 进行操作的答案,我们只需找到一个 anss>0\text{ans}_s>0 即可。
而根据题意,有:
anss=i=1n(1)fi(s)vi\text{ans}_s=\sum_{i=1}^n(-1)^{f_i(s)}\cdot v_i
注意到:
s=02621anss=s=02621i=1n(1)fi(s)vi=i=1ns=02621(1)fi(s)vi\sum_{s=0}^{2^{62}-1}\text{ans}_s=\sum_{s=0}^{2^{62}-1}\sum_{i=1}^n(-1)^{f_i(s)}\cdot v_i=\sum_{i=1}^n\sum_{s=0}^{2^{62}-1}(-1)^{f_i(s)}\cdot v_i
又注意到,(1)fi(s)+(1)fi(s bitxor 1)=0(-1)^{f_i(s)}+(-1)^{f_i(s\text{ bitxor }1)}=0。这是因为 sss bitxor 1s\text{ bitxor }1 仅在最低位有区别,因此二进制下 11 的个数一奇一偶。因此,有:
s=02621anss=i=1ns=02621(1)fi(s)vi=i=1n0=0\sum_{s=0}^{2^{62}-1}\text{ans}_s=\sum_{i=1}^n\sum_{s=0}^{2^{62}-1}(-1)^{f_i(s)}\cdot v_i=\sum_{i=1}^n0=0
d(l,r)=i=lranssd(l,r)=\sum\limits_{i=l}^r\text{ans}_s。上面的观察告诉我们,d(0,2621)=0d(0,2^{62}-1)=0。发现可以二分,d(0,2611)d(0,2^{61}-1)d(261,2621)d(2^{61},2^{62}-1) 必定一正一负,并且负的区间中必定存在一个 anss<0\text{ans}_s<0。特别的,若两个区间和均为 00,由于 ans0>0\text{ans}_0>0,因此左半区间一定存在 anss<0\text{ans}_s<0。于是,现在的问题变为如何快速计算 d(l,r)d(l,r)
由于二分的特殊性,不难发现,我们所要计算的区间 [l,r][l,r] 都一定是二进制下一个前缀固定,剩下部分任取。与上面同理,我们不难得到:
d(l,r)=i=1ns=lr(1)fi(s)vid(l,r)=\sum_{i=1}^n\sum_{s=l}^r(-1)^{f_i(s)}\cdot v_i
因此,我们需要解决的问题是,对于每个 ii,求所有二进制下前缀是某个定值、后面任取的 ssf(s,i)f(s,i) 之和。设固定的前缀长度为 tt,若 wiw_i 在前 tt 位外仍有 11,则显然贡献会两两抵消,答案为 00。否则直接计算即可。
复杂度 O(nlog2V)\mathcal{O}(n\log^2V)

题意较复杂,不多赘述。
考虑奶牛走的路线必定如下图所示。
To be continue.

To be continue.
To be continue.



2025/02/06 (DP 及其优化)

nn 个集合 SiS_i,满足 Si[1,m]ZS_i\subseteq[1,m]\cap\Z。其中有些集合未确定,你可以自行钦定。
设可重集 TT,初始为 \varnothing。依次遍历每个集合,同时向 TT 中加入 SiS_i 中的所有元素。若 TT 包含重复元素,则令 TT\gets\varnothing
钦定未确定的集合,求 T|T| 的最大值。
n,m2×105n,m\le2\times10^5
fif_i 表示能否使得 TT 经过 SiS_i 后恰被清空。
显然,若 ki=0k_i=0,则 fi=1f_i=1。否则,考虑枚举上一次被清空的位置 jj,若存在 jj 满足:
  • 位置 jj 可被清空,即 fj=1f_j=1
  • 区间 (j,i)(j,i) 中无重复元素,即 j<k<iSk=\bigcap\limits_{j<k<i}S_k=\varnothing
  • 到位置 ii 时有重复元素,即 (j<k<iSk)Si\left(\bigcup\limits_{j<k<i}S_k\right)\cap S_i\ne\varnothing
fi=1f_i=1
发现满足第二条的 jj 是一段后缀,而满足第三条的 jj 是一段前缀。* 具体求解可使用双指针和桶。我们只需要求这一段前缀和后缀的交中,是否存在 fj=1f_j=1。因此,我们只需维护 gig_i 表示 ii 之前最近的 fj=1f_j=1 的位置,判断是否有 grlg_r\ge l 即可。
求解答案时,我们找到最长的后缀 [l,n][l,n] 使得其中无重复元素。则

nn 件物品,背包体积为 AA,有 BB 个货币。第 ii 个物品价值 pip_i,体积 aia_i,每用 bib_i 个货币可以使其体积减少 11。求最大价值。
n,A,B2×103n,A,B\le2\times10^3
题目分为两步:选出一些人来贿赂,以及给这些人分配冰淇淋。
第二步是容易的,贪心的给 xix_i 较小的人即可。按 xix_i 从小到大排序。故必定存在一个分界点,前面只用冰淇淋,后面只用牟尼,而这个处于分界点的人可能需要混合使用冰淇淋和牟尼。
因此,不妨设 fi,jf_{i,j} 表示前 ii 个人只用 jj 个冰淇淋能得到的最大受欢迎度,而 gi,jg_{i,j} 表示后 ii 个人只用 jj 个牟尼能得到的最大受欢迎度。
统计答案时,枚举分界点处的第 ii 个人用 aa 个牟尼,计算出其还需要 bb 个冰淇淋,则用 fi1,Bb+gi+1,Aa+pif_{i-1,B-b}+g_{i+1,A-a}+p_i 更新答案即可。
复杂度 O(n2)\mathcal{O}(n^2)

长为 nn 的序列 aia_i,消除长为 xx 的连续同色段的分数为 x2x^2。求最大分数。
n200n\le200
考虑一个朴素区间 dp,设 fl,rf_{l,r} 表示区间 [l,r][l,r] 的最大答案。转移时考虑枚举最后一次消除的编号,则有:
fl,r=maxli1<i2<<ikr{fl,i11+fi1+1,i21++fik+1,r+k2}f_{l,r}=\max_{l\le i_1<i_2<\cdots<i_k\le r}\{f_{l,i_1-1}+f_{i_1+1,i_2-1}+\cdots+f_{i_k+1,r}+k^2\}
mm 个三元组 (ai,bi,ci)(a_i,b_i,c_i)。构造长为 nn 的序列 {pn}\{p_n\}。若 minaijbipjci\min\limits_{a_i\le j\le b_i}p_j\le c_i 则产生 minaijbipj\min\limits_{a_i\le j\le b_i}p_j 的贡献,否则没有贡献。试最大化贡献。
n50n\le50m4×103m\le4\times10^3
fl,r,kf_{l,r,k} 表示只考虑 [ai,bi][l,r][a_i,b_i]\subseteq[l,r] 的约束,且 [l,r][l,r] 中的最小值至少为 kk 时的最大收益。
转移时枚举值为 kk 的位置 pp,即:
fl,r,k=maxlpr{fl,p1,k+fp+1,r,k+cnt(l,r,p,k)k}f_{l,r,k}=\max_{l\le p\le r}\{f_{l,p-1,k}+f_{p+1,r,k}+\text{cnt}(l,r,p,k)\cdot k\}
其中 cnt(l,r,p,k)\text{cnt}(l,r,p,k) 表示满足以下条件的三元组数量:
  • [ai,bi][l,r][a_i,b_i]\subseteq[l,r]
  • p[ai,bi]p\in[a_i,b_i]
  • cikc_i\ge k
不妨离散化,仅需考虑 kkcic_i 之一。
如何计算 cnt\text{cnt} 函数?考虑容斥,不妨预处理 sl,r,ks_{l,r,k} 表示满足以下条件的三元组数量:
  • [ai,bi][l,r][a_i,b_i]\subseteq[l,r]
  • cikc_i\ge k
则有:
cnt(l,r,p,k)=sl,r,ksl,p1,ksp+1,r,k\text{cnt}(l,r,p,k)=s_{l,r,k}-s_{l,p-1,k}-s_{p+1,r,k}
如何处理 ss 数组?显然可以差分,将 cikc_i\ge k 转化为 ci=kc_i=k。此时即为一个二维数点问题,无需数据结构优化,直接暴力即可。复杂度 O(n2m)\mathcal{O}(n^2m)
总复杂度 O(n3m)\mathcal{O}(n^3m)

有长为 nn 的值域为 [1,k][1,k] 的序列 {an}\{a_n\},其中有些位置未填。填入这些数使得不存在长为 ll 的连续同色段,求方案数。对 998244353998244353 取模。
n105n\le10^5k100k\le100
fi,jf_{i,j} 表示考虑了前 ii 个数并且 ai=ja_i=j 的合法方案数。令 si=1jkfi,js_i=\sum\limits_{1\le j\le k}f_{i,j}
根据定义,若 ai1a_i\ne-1,则 fi,ai=1f_{i,a_i}=1
对于其他的 aia_i,若 $$


To be continue.
斜率优化

决策单调性



凸优化。

2025/02/07 (模拟赛 树)


2025/02/08 (链剖 树上启发式合并 Prufer 点分治 边分治)



2025/02/09 (模拟赛 线段树)

评论

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

正在加载评论...