# [Educational Codeforces Round 171](https://codeforces.com/contest/2026)
1|0Educational Codeforces Round 171
1|1D. Sums of Segments
定义四个前缀和:
\(s_i=a_1+a_2+\dots+a_i\)
\(u_i=s_1+s_2+\dots+s_i\)
\(t_i=s(i,i)+s(i,i+1)+\dots+s(i,n)\)
\(ts_i=t_1+t_2+\dots+t_i\)
\(s_i\)为\(a_i\)的前缀和,\(u_i\)为\(s_i\)的前缀和,\(t_i\)为分块之后第\(i\)块的和,\(ts_i\)为\(t_i\)的前缀和,也是分块之后的前缀和
\(b\)数组中第\(k\)块的个数是\(n-k+1\),前\(k\)块的总数为\(nk-\frac{k(k-1)}{2}\)
由前\(k\)块的总数可以二分,定位到\(l,r\)的块数,假定分别\(x,y\)
此时和\(sum=ts_{y}-ts_{x-1}\),还需要减去在\(x,y\)块中多加的
此时需要求位置\(l,r\)在块中的第几个
设第\(l,r\)个元素是\(s(x,z),s(y,w)\),由于位置\(xn-\frac{x(x-1)}{2}\)上的元素是\(s(x,n)\),则有
\(n-z=xn-\frac{x(x-1)}{2}-l\),可得:\(z=n-xn-\frac{x(x-1)}{2}+l\)
同理:\(w=n-yn-\frac{y(y-1)}{2}+r\)
然后删去多出来的部分
对于第\(x\)块,位置\(l\)在\(s(x,z)\),所以要去掉\(s(x,1)+s(x,2)+\dots+s(x,z-1)\),即下图中红色部分,就可以用我们前面的前缀和求取,
蓝色梯形部分为:\(u_{z-1}-u_x\)
橙色矩形部分为:\((x-z)s_{x-1}\)
所以减去的红色部分为:\(u_{z-1}-u_x-(x-z)s_{x-1}\)
同理可得对于第\(y\)块,需要减去的部分为:\(u_n-u_{w-1}-(n-w)s_{y-1}\)
代码如下:
__EOF__

本文链接:https://www.cnblogs.com/xdeyt/p/18516173.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 【.NET】调用本地 Deepseek 模型