LOG

发布时间 2023-12-16 11:33:06作者: 最爱丁珰

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

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

于是我们可以猜测一个结论,若\(\sum_{所有正数} min(val,s)≥c \times s\)则可以否则不行

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

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

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

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

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

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

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

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

证毕

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