kirasa

T3 魔法少女(kisara)

我们先初步化简一下原式,即:

ans=l=lrr=lr(i=lrai)2+l=lrr=lr(rl+2)(rl)alar

将式子中后面那一堆中的 rl+2 提出来,即:

ans=l=lrr=lr(i=lrai)2+(rl+2)l=lrr=lr(rl)alar


我们单独分析一下 ans 前面那一堆,将平方拆开,会变成:

ans2=l=lrr=lr(lrai)2=l=lrr=lr(lrai2+2×li<rraiaj)

想象一下最后去掉前两个 后合并同类项,那么

对于 ai2 的系数:(il+1)×(ri+1)

对于 aiaj(i<j) 的系数:2×(il+1)×(rj+1)

那么我们就可以重写一下 ans2,即:

ans2=i=lr(il+1)(ri+1)ai2+li<jr2(il+1)(rj+1)aiaj


观察 ans2,我们发现现在的时间复杂度瓶颈还是在于后面那一堆,那我们接下来再来单独分析一下 ans2 后面那一堆。

我们想要让后面的那一堆达到类似于 (i=lrxiai)×(i=lryiai) 的效果。

由于后面那一堆的式子的系数为 2,所以我们可以尝试把它写开:

ans3=li<jr(il+1)(rj+1)aiaj+li<jr(il+1)(rj+1)aiaj

发现我们现在只有 i<j 的情况,没有 j<i 的情况,我们可以先暂时将后面那一堆的 ij 两个变量交换一下:

ans3=li<jr(il+1)(rj+1)aiaj+lj<ir(jl+1)(ri+1)aiaj

很显然,我们发现,虽然有了 i<jj<i 的情况,但是前面的系数对不上,所以我们可以将后面那个式子转化一下:

ans3=li<jr(il+1)(rj+1)aiaj+lj<ir[il+1(ij)][rj+1(ij)]aiaj

ans4 为后面那一堆,把后面的化开:

ans4=lj<ir(il+1)(rj+1)aiaj+lj<ir(ij)2aiajlj<ir(ij)(rl+ij+2)aiaj

第一项不就是我们想要的东西吗?


我们发现,ans4 的最后一项看起来非常的恶心,但是我们发现第二项的系数里有 ij 和前面的 ij 共同组成一个 (ij)2,还有 rl+2 与前面的 ij 共同组成一个 (rl+2)(ij),即:

ans5=lj<ir(ij)2aiaj+lj<ir(rl+2)(ij)aiaj

那么 ans5 的第一项和 ans4 的第二项就可以消掉了。


ans5 代进 ans4 为:

ans4=lj<ir(il+1)(rj+1)aiajlj<ir(rl+2)(ij)aiaj

非常简洁!

继续带回 ans3,即:

ans3=li<jr(il+1)(rj+1)aiaj+lj<ir(il+1)(rj+1)aiajlj<ir(rl+2)(ij)aiaj

我们发现,前面那两项合并之后就是 i=lrj=lr(il+1)(rj+1)aiaji=lr(il+1)(ri+1)ai2

相当于就是缺少了 i=j 的情况,只需要抠掉就是上面的式子了。

继续带回 ans3,即:

ans3=i=lrj=lr(il+1)(rj+1)aiaji=lr(il+1)(ri+1)ai2lj<ir(rl+2)(ij)aiaj

再带回 ans2,即:

ans2=i=lrj=lr(il+1)(rj+1)aiaji=lr(il+1)(ri+1)ai2lj<ir(rl+2)(ij)aiaj+i=lr(il+1)(ri+1)ai2

第二项和第四项又可以消掉哩!ans2 就变成了:

ans2=i=lrj=lr(il+1)(rj+1)aiajlj<ir(rl+2)(ij)aiaj

最后再带回 ans 就是:

ans=i=lrj=lr(il+1)(rj+1)aiajlj<ir(rl+2)(ij)aiaj+(rl+2)l=lrr=lr(rl)alar

重写一下 ans 的第二项和第三项:

ans=i=lrj=lr(il+1)(rj+1)aiaj(rl+2)lj<ir(ij)aiaj+(rl+2)lijr(ji)aiaj

第二项中,发现当 i=j 时,ij 直接等于 0 了,对答案没有影响,我们可以直接将 i=j 的情况放进去:

ans=i=lrj=lr(il+1)(rj+1)aiaj(rl+2)ljir(ij)aiaj+(rl+2)lijr(ji)aiaj

交换第二项的 ij 得:

ans=i=lrj=lr(il+1)(rj+1)aiaj(rl+2)lijr(ji)aiaj+(rl+2)lijr(ji)aiaj

然后第二项和第三项就又可以消掉啦!

最后 ans 就是 i=lrj=lr(il+1)(rj+1)aiaj

重写一下 ans 就是:

ans=[i=lr(il+1)ai][j=lr(rj+1)aj]

只需要线段树维护 i×ai 之和和 ai 之和即可,此步骤支持区间修改和区间求和。

时间复杂度 O(qlogn)

posted @   Smallbasic  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示