CF1204E Natasha, Sasha and the Prefix Sums
借鉴了 大佬博客
求\(n\)个\(1\)和\(m\)个\(-1\)形成的所有序列的最大前缀和之和,\(n,m \leqslant 1e6\)
设\(f[i]\)表示最大前缀和正好等于i的序列的个数,则最后答案为 \(\sum_{i=1}^n i*f[i]\),下面利用容斥来求\(f[i]\):
设\(g[i]\)表示最大前缀和正好等于i的序列的个数,则 \(f[i] = g[i+1]-g[i]\)
然后在坐标系上,\(+1\)向右 \(-1\)向上 每种序列看成一个从\((0,0)\)到\((n,m)\)的路径
要求最大前缀和大于等于\(k\),即为 存在 \(x-y\geqslant k\) 的点
,则路径必须经过 \(y=x-k\)
即从\((0,0)\)到\((n,m)\)经过直线\(y=x-k\)的路径数即为\(g[k]\)
将\((0,0)\)关于 \(y=x-k\) 对称得到\((k,-k)\),则\((k,-k)\)到\((n,m)\)的路径数即为所求
得到\(g[k]=(n+m,n-k-1)\)
则\(f[k]=g[k+1]-g[k]=\binom{n+m}{n-k}-\binom{n+m}{n-k-1}\)
但是要注意\(f,g\)的定义:当\(k \leqslant n-m\)时,最大前缀和不可能为\(k\),\(f[k]\)为\(0\)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include