多校冲刺 NOIP2021 (18) —「莓良心·尽梨了·团不过·七负我」
莓良心
考场上先基于第二类斯特林数写了一个 \(n^2\) 的 dp 。
正常递推 \(g_{i,j}\) 代表把 \(i\) 个元素分到 \(j\) 个盒子的方案数,同时设 \(f_{i,j}\) 代表 \(i\) 个元素,\(j\) 个盒子的答案。
也就是根据实际意义考虑两种第二类斯特林数的转移。
第一种新开一个盒子的类型,新的贡献就是他自己一个元素,直接乘上上一个有多少种方案就行了。
第二种装到原来盒子的类型比较复杂,解释一下。
首先 \(j*f_{i-1,j}\) 是正常把原有贡献拉过来,在考虑加入一个元素到原来大小为 \(z\) , \(\sum w=t\) 的集合, 产生的额外的贡献。
现在先考虑一种方案额外的贡献,最后乘上 \(g_{i-1,j}\) 就行了。
原贡献是 \(z*\sum w\) , 现在的贡献是 \((z+1)*(\sum w + w[i])\) , 差值是 \(z * w [i]+\sum w + w [i]\)
考虑以上贡献对所有方案求和,第一部分也就是 \(\sum z * w [i]\) , \(\sum z\) 是什么? 总集合大小,就是 \(i-1\)
第二部分 \(\sum w\) 也就是 \(sum[i-1]\) , 第三部分,有几个集合加几个 \(w [i]\) , 也就是 \(j*w[i]\)
然后发现这个 \(dp\) 并没有什么扩展性,然后就想枚举 \(x\) 统计答案。
\(ans=\sum x *sum(x)*time(x)\) , \(sum(x)\) 是所有集合大小为 \(x\) 的集合的元素的总和(每个集合计算一遍)。
计算这个,因为所有元素是等价的,所以只需考虑每个元素被计算几遍就行了。
不同的大小为 \(x\) 的集合一共有 \(\binom{n}{x}\) 个,每个有 \(x\) 个元素,一共有 \(n\) 个元素 , 所以 \(sum(x)=sum*(\binom{n}{x}*x/n)=\binom{n-1}{x-1}*sum\)
\(time(x)\) 就是大小为 \(x\) 的集合被计算了多少遍,计算这个直接考虑把这 \(x\) 个捆绑成一个元素,占一个盒子。
剩下的有多少种方案,就会被计算多少遍,也就是 \(g_{n-x,m-1}\)
所以 \(Ans=sum*\sum x*\binom{n-1}{x-1}*g_{n-1,m-1}\) , 不会算斯特林数就死了。
上述过程全部是 \(40pts\) 做法。
考场上认为算一列斯特林数很简单并且可以 \(O(n)\) , 所以以为就差个版就没接着推。
第二类斯特林数可以 \(O(n)\) 计算一个,并且很少的概率考计算一列\一行斯特林数。
所以考虑怎么用 \(O(1)\) 的斯特林数表示答案。
直接考虑每个元素被计算多少遍,因为所有元素等价,只需要用 \(time*sum\) 就可以得到答案。
我们先统计所有的元素一遍,也就是 \(g_{n,x}\) ,接下来每有一个元素和他在一个集合,他就会被多算一遍。
考虑把这两个多计算的元素捆绑成一个元素,额外贡献就是 \(\sum_{u\not=v} (w_u+w_v)*g_{n-1,x}=(n-1*sum)*g_{n-1,x}\)
所以 \(Ans=sum*(g_{n,x}+(n-1)*g_{n-1,x})\) , 考虑如何计算一个斯特林数。
这是一个经典的套路,设 \(f(x)\) 为至少 \(x\) 个盒子为空的方案数, \(g(x)\) 为恰好 \(x\) 个盒子为空的方案数。
\(f(x)=(m-x)^n\) , 注意这么写是球,盒都有编号,否则如果你想让盒无编号,那么就又成斯特林数了。。。
直接二项式反演,再把编号去掉 \(g(0)=(\sum(-1)^i*\binom{m}{i}*(m-i)^n)/m!\) 。
线性筛 \((m-i)^n\) 复杂度 \(O(n)\) 。
感觉这道题还是很nb的,一般很多东西等价的时候,可以多尝试从几个方面入手。
斯特林数的容斥也没必要在学斯特林再掌握,感觉容斥还是有点弱。
尽梨了
邻项交换容易证明按 \(\frac{a}{b+1}\) 从大到小排序是最优的。
然后我就傻了,直接按这个排序用前 \(m\) 个。。。。
分析他的含义,它的意义是当你选择这几个元素后,这样排序代价最小,而并不是这样选择最优。
看来对邻项交换还是没咋掌握,注意要结合你邻项交换的条件选择策略 , 而不是直接排序完事。
然后我就一直想按这个开 \(set\) 维护,证明了各种贪心性质。
结果,我们可以直接把原序列按这个排序,答案必定是他的一个子序列,然后 \(dp\) 优化枚举过程,就可以 \(n^2\) 。
感觉这个是邻项交换的另一个方面吧,之前都是邻项交换,排序直接选或者操作。
当邻项交换应用的是选择后按此排序最优时,但并不知道选择策略,可以考虑排完序之后 dp 选择一个子序列。
剩下的就很简单了,发现 \(a>0\) 每次至少翻倍,只用做 \(log\) 次,把 \(0\) 拎出来贪心从小选就好了。
团不过
以为是 \(Nim\) 就跑路了,实际是卡农的简化版。
题目就要求排列有多少种,设 \(f_i\) 代表 \(i\) 堆石子的排列有多少种。
发现前 \(i-1\) 堆确定,这个也确定,所以把 \(i-1\) 堆的全部情况减去不合法的情况就是 \(f_i\) 。
不合法情况分两种,一种是合格局面没有集合能让他异或和为0,一种是没有没用过的集合让他异或和是0.
第一种很简单,就是前 \(i-1\) 堆异或和是0,第二种可以发现一定可以表示成 \(i-2\) 堆是0,考虑插入,就可以得到 \((i-1)*(2^n-i+1)*f_{i-2}\) 的式子。
求出来先手必败用全部情况减去就行了。
七负我
两个点之间没有连边,可以调整证明一个为0不会使答案变劣。
具体方法就是保证和不变, \(x*a+y*b\rightarrow(x-T)*a+(y+T)*b\) 然后做差。
所以最终分配答案的就是一个完全图。
然后就是找最大的完全图子图,折半状压也可以,也可以 \(BK\) 算法搜索。
\(BK\) 就是 \(dfs\) + 剪枝,但是需要注意的是必须找到一个使答案更优的团就立马退出。
相比于状压记录团具体是啥,他只记录团的大小,根据单调性剪枝,每次重新搜索,至于复杂度,不会证明,赵sir博客有证明(的论文)。
总结
连续三天垫底了,今天这场一个都不会,太拉了。
T1大概一个半小时确信自己不会斯特林了,就放弃了。
T2没怎么想进去,主要是不知道考场在干什么,一直怀疑自己邻项交换搞错了,没想到怎么更好的利用邻项交换,dp去选子序列。
T3一看博弈论就跑路了,直接没脸抄boxin大佬的表,只有样例 \(n=2\) 对了,差评。
T4没怎么想,输出平方就跑路了。
感觉T2,T3,T4好好做哪个都不至于考的烂成这样,主要是T2瞎折腾花了很长时间(尝试各种排序方式,颠倒大于小于)。
以后见到被hack确定没码错之后就好好想,思考哪里出问题了,怎么解决,能不能换一个思路,而不要瞎折腾,只会浪费时间。
T2一直磕在用贪心构造一个最终合法序列了,没换思路。
还有不要尝试调试大样例,直接打拍就好了,还能获得一个有分的暴力。

浙公网安备 33010602011771号