ABC378 E 题解

ABC378 E 题解

题意

给定序列 A ,求 1lrn(lirAimodM)

计算所有区间和取模之后的结果再求和。

注意外层是没有取模的。

如果是外层也要取模的情况,那还是十分好办的,直接贡献法计算每个数字被统计了多少次就可以了。

问题就在于外层没有取模,之前好像也没有做过这种东西,于是就开始各种乱搞了,思路大概就是先算出不取模的结果,然后计算需要取模多少次,最后统一减去若干个 MOD

甚至还用上了 double 这种玩意。、、

分析

转化题意, [L,R] 的区间和,用前缀和来表达就是 srsl1 ,这样就转化成了两点之差,所以我们要统计的就是所有的两点之差。

如果我们在做前缀和的时候就取模,那么 srsl1 便有可能是负数, 但是注意到取模运算是乘法封闭的,是个负数的话 ,加上一个 MOD 就可以变成正确的值。

可以发现需要加上的 MOD 数,就是前缀和数组中的逆序对数量。

srsl1 可以通过二位前缀和快速算出,注意要考虑 s0

细节

树状数组求逆序对还需要访问 0 的下标,所以树状数组的整体下标应该右移 1

Code

Trick

求区间和可以转化成前缀和的差值,这样就简化了问题,变成了两点之差。

posted @   Hanggoash  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
动态线条
动态线条end
点击右上角即可分享
微信分享提示