NOIP 模拟 20/11/16

博客围绕A、B、C、D四个方面的算法问题展开。涉及栈合并贡献计算、集合染色方案的充分必要性证明及DP求解、序列合法性判断与构造、最大匹配问题的背包解法及优化,还有倍增和二分查找次数的分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A

B

考虑两个栈合并,第二个栈的贡献可以直接算
然后要用第二个栈的 min⁡\minmin 去找到第一个 <<< 它的位置算贡献
枚举这个位置算 >>> 它的 min⁡\minmin 有多少个就可以了

C

注意到每次就是抠出来一个集合 SSS,它的补集填一种颜色
首先这样操作一定是合法的(充分性)
下面证必要性:只需证明合法的染色方案一定存在 zzz 使得包涵 zzz 的集合为同一种颜色
若不存在 zzz,设 UUU 为全集且为黑色,那么我们考虑所有为白色的集合
由于包涵 zzz 的集合中两个颜色都有,所以 UUU 一定为白色
那么基于这个进行 DP\mathcal{DP}DP 就可以了

D

注意到第一次出现的位置单调不降
ax,bxa_x,b_xax,bxxxx 在两个序列里最后出现的位置
那么若 ax>bxa_x>b_xax>bx 则不合法
bbb 中有 aaa 中没有的数那么不合法
我们从后往前构造,此时将 aia_iai 变成 bib_ibi
容易知道 iii 之后一定有个 aj=bia_j=b_iaj=bi
所以我们可以把 iii 之前的 aia_iai 都变成 bib_ibi 然后把 aia_iai 变成 bib_ibi

A

容易发现答案为 a1−a2a_1-a_2a1a2
归纳,若最先合并 an−1,ana_{n-1},a_nan1,an 或者不是,二者是对称的

B

一位一位确定,设当前有 cccpi=ip_i=ipi=i,有 ttt 个没有填的 >i>i>i
c←m−cc\leftarrow m-ccmc
先钦定 (tc)\binom{t}{c}(ct) 然后相当于是 t−ct-ctc 个可以 pi=ip_i=ipi=in−i−cn-i-cnic 个空位
jjjpip_ipi 可以 =i=i=i 的放 iii 个空位的方案数为 Fi,jF_{i,j}Fi,j
Fi,j=∑k≤j(jk)(i−k)!(−1)k=∑k≤j(j−1k)(i−k)!(−1)k+∑k(j−1k−1)(i−k)!(−1)k=Fi,j−1+∑k(j−1k)(i−1−k)!(−1)k+1=Fi,j−1−Fi−1,j−1F_{i,j}=\sum_{k\le j}\binom{j}{k}(i-k)!(-1)^k\\=\sum_{k\le j}\binom{j-1}{k}(i-k)!(-1)^k+\sum_{k}\binom{j-1}{k-1}(i-k)!(-1)^k\\=F_{i,j-1}+\sum_{k}\binom{j-1}{k}(i-1-k)!(-1)^{k+1}=F_{i,j-1}-F_{i-1,j-1}Fi,j=kj(kj)(ik)!(1)k=kj(kj1)(ik)!(1)k+k(k1j1)(ik)!(1)k=Fi,j1+k(kj1)(i1k)!(1)k+1=Fi,j1Fi1,j1
Fi,j=Fi−1,j+Fi,j+1F_{i,j}=F_{i-1,j}+F_{i,j+1}Fi,j=Fi1,j+Fi,j+1

C

考虑 r=nr=nr=n 怎么做,容易发现最大匹配为 min⁡(a,b)\min(a,b)min(a,b)a,ba,ba,b 为左右非零度点个数
于是可以做背包 O(n2m2)\mathcal{O}(n^2m^2)O(n2m2)
考虑如何最小化最大匹配,由 Hall\mathcal{Hall}Hall 定理,最大匹配为 n+min⁡S(∣N(S)∣−∣S∣)n+\min_S(|N(S)|-|S|)n+minS(N(S)S)
我们现在知道每个点的度数,要构造一个图使最大匹配最小
那么我们一定会选左边几个度数最小的点,找到右边几个度数最大的点连过去
d(S)d(S)d(S) 为集合 SSS 的度数和
n+min⁡S,T(∣T∣−∣S∣∣d(S)≤d(T))n+\min_{S,T}(|T|-|S|\mid d(S)\le d(T))n+minS,T(TSd(S)d(T))
容易发现只需要在背包里面记录 ∣S∣,d(S)|S|,d(S)S,d(S)
因为最优解一定可以取到且非法解一定不会取到
复杂度 O(n3m3)\mathcal{O}(n^3m^3)O(n3m3)

D

考虑倍增,要用 7k7k7k
注意到找到最大的 ttt 使得 2t2^t2t 查出来是 2t2^t2t2t+12^{t+1}2t+1 查出来不是
那么 2t+12^{t+1}2t+1 查出来的就是答案,二分一下只用 3k3k3k

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FSYo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值