对于以下类似代码
for(int i=1,l=1;i<=n;i++) { if(a[i]==a[i-1])l++; else { for(int j=1;j<=l;j++)r[j]+=(l/j)*j; l=1; } }
其中数组r从1到l的分别加和赋值,可以通过对(l/j)整除分块和差分快速实现,最后只需进行前缀求和就能得到答案。 不过由于涉及到二阶差分求和,所以可能很少人想到这种优化,就在这里提一下。 如果不懂我在说什么的那就算了,反正这种优化也不是必须的。