LOG

这道题目跟无穷级数的思想一样:如果我们横向考虑不行就纵向考虑(或者交换对象考虑)

首先对数列中的数,如果他比s大,那么可以把他改成s显然不影响答案

于是我们可以猜测一个结论,若min(val,s)c×s则可以否则不行

当左边小于右边的时候肯定不行

然后我们考虑如何构造出合法的方案

我们发现如果考虑每次选的c个正数是什么就很难考虑

所以我们交换对象(或者说,原来是横向考虑的,这里变成纵向考虑),考虑每一个正数在最终的构造中应该在什么位置

我们先画出s×c大小的矩阵,其中每一横行表示构造方案中每次取的数

然后对每个正数我们从上往下,从左到右依次填写,比如有三个1和两个2的时候

如果又有五个4,由于每个数的贡献最多是s,所以我们只取四个4

显然最终的矩阵每一横行都不会出现相同数字,所以符合题意,而由于min(val,s)c×s,所以刚好填满这个矩阵

证毕

于是这道题目就变成了查询大于s的数有多少个和小于s的数的和,离散化一下用树状数组即可

posted @   最爱丁珰  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示