Loading

多校冲刺 NOIP2021 (18) —「莓良心·尽梨了·团不过·七负我」

莓良心

考场上先基于第二类斯特林数写了一个 \(n^2\) 的 dp 。

正常递推 \(g_{i,j}\) 代表把 \(i\) 个元素分到 \(j\) 个盒子的方案数,同时设 \(f_{i,j}\) 代表 \(i\) 个元素,\(j\) 个盒子的答案。

\[f_{i,j}=(f_{i-1,j-1}+w[i]*g_{i-1,j-1})+(j*f_{i-1,j}+g_{i-1,j}*((i+j-1)*w[i]+sum[i-1])) \]

也就是根据实际意义考虑两种第二类斯特林数的转移。

第一种新开一个盒子的类型,新的贡献就是他自己一个元素,直接乘上上一个有多少种方案就行了。

第二种装到原来盒子的类型比较复杂,解释一下。

首先 \(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一直磕在用贪心构造一个最终合法序列了,没换思路。

还有不要尝试调试大样例,直接打拍就好了,还能获得一个有分的暴力。

posted @ 2021-10-30 07:25  Soresen  阅读(268)  评论(0)    收藏  举报