当前位置: 首页 > news >正文

前缀和pre,如何求总和:pre(r) - pre(l)(1 = l = r = n),以及|pre(r) - pre(l)|

我们假设 pre[i]: 数组前i个数的之和,这就是前缀和

计算所有下标对 (1 <= l <= r <= n) pre[r] - pre[l] 之和

如果数据量是 n <= 1e5,直接两个for循环暴力求解的话,时间复杂度O(N^2),太慢了

暴力方法

点击查看代码
ll brute(){ll ans = 0;for(int l = 1;l<=n;l++){for(int r = l+1;r<=n;r++){ans += pre[r] - pre[l];}}return ans;
}

我们仔细观察,可以发现,
整个过程就是 :
ans += pre[i] - pre[j] (i固定,1 <= j < i),ans +=pre[j]-pre[i](i固定,i < j <= n)
通过这个式子,我们可以得到这个结论: -pre[i]出现了 n - i 次,+pre[i] 出现了 i - 1次
那么我们可以根据这个结论,遍历一遍数组,进行求和就好
时间复杂度为O(N)

点击查看代码
ll go(){ll ans = 0;for(int i = 1;i<=n;i++){// 这里可以整合成这样:ans += pre[i] * (2 * i - n - 1);ans += pre[i] * (i - 1); // +pre[i] 出现了 i - 1次ans -= pre[i] * (n - i); // -pre[i]出现了 n - i 次}return ans;
}

计算所有下标对 (1 <= l <= r <= n) |pre[r] - pre[l]| 之和

这里的||代表取绝对值

暴力方法

点击查看代码
ll brute(){ll ans = 0;for(int l = 1;l<=n;l++){for(int r = l+1;r<=n;r++){ans += std::abs(pre[r] - pre[l]);}}return ans;
}

如何优化呢?
我们再观察一下:
整个过程就是 :
ans += |pre[i] - pre[j]| (i固定,1 <= j < i),ans += |pre[j]-pre[i]| (i固定,i < j <= n)
根据绝对值的性质,如果pre[i] 比 pre[j]大,那么我们可以认为pre[j] 是减去的,pre[i]是加上的
否则就是pre[j] 是加上,pre[i]就是减去,结果和 |pre[i] - pre[j]| 是一样的
那么,在整个过程中,有多少个pre[i]是减去和以及多少个pre[i]是加上的呢?
我们可以先排序
这样,大小关系就明确了,那么对于每一个pre[i]:
比pre[i]小的有 i - 1 个,也就意味着有 i - 1 个 pre[i] 应该加上
比pre[i]大的有 n - i 个,也就意味着有 n - i 个 pre[i] 应该减去
那么我们可以根据这个结论,去解决这个问题
时间复杂度为O(N* log N) ,因为排序时间复杂度是这个

点击查看代码
ll go(){ll ans = 0;std::sort(pre+1,pre+1+n);for(int i = 1;i<=n;i++){ans += pre[i] * (i - 1);ans -= pre[i] * (n - i);}return ans;
}

可以发现,这和上面那个求pre[r] - pre[l]总和代码是一样的,只是多了个排序而已。

http://www.wxhsa.cn/company.asp?id=5604

相关文章:

  • P11537 [NOISG 2023 Finals] Toxic Gene 题解
  • keil5中stm32相关记录
  • centos7中mysql环境配置
  • centos7中php环境配置
  • Symfony学习笔记 - 利用Doctrine开发一个学生信息的增删查改
  • 函数计算进化之路:AI Sandbox 新基座
  • linux通过smb共享文件夹,windows进行连接
  • 强制Apache Web服务器始终使用https
  • 初始vue3
  • 如何在Nginx服务器配置https以及强制跳转https
  • centos7中安装protobuf-c
  • 赞助NYU-Poly女性网络安全研讨会:推动行业多元发展
  • MyEMS:开源能源管理的探索与实践
  • 实时内核中的调度程序节流
  • 配置Burp Suite与Proxifier抓取微信小程序流量
  • 我的ai 相关工具站
  • C#第十一章 023 024
  • MyEMS:赋能每一个组织,成为自己的能源管理专家
  • Vue开发微信公众号上传图片
  • centos7中scrapy运行环境配置
  • flutter配置国内镜像
  • 微信小程序 live-player 无声音
  • 栈的妙用:如何优雅地处理括号匹配难题 (C语言版)
  • 食品包装 AI 视觉检测技术:原理、优势与数据应用解析
  • 电流探头的常见应用场景
  • WebRTC编码过载检测与帧率适应机制分析报告
  • PC桌面应用开发选择
  • 陈燕的项目启动笔记
  • C++面试宝典八股文之什么是封装、继承、多态(附面试宝典八股文PDF)
  • 无需复杂正则:SLS 新脱敏函数让隐私保护更简单高效