博客
关于我
D. Nastya and a Game【思维】
阅读量:529 次
发布时间:2019-03-08

本文共 1550 字,大约阅读时间需要 5 分钟。

针对给定的数组Arr[n],我们需要计算满足Condition:multipul[L...R]/sum[L...R]==k的区间个数。这种问题可以通过划分区间和利用跳跃指针的技术进行高效求解。

我的思路

对于数组中某个位置i,当a[i]==1时,它对区间内的乘法操作没有影响,只会影响区间的起始和终止位置。因此,可以跳过这种情况的处理,仅仅考虑实际影响区间乘积的元素。

对于a[i]!=1的情况,我们需要考虑连续区间内的乘积及区间和。为了高效定位满足条件的区间,我们可以利用跳跃指针(Jump pointer)技术。每次跳跃指针的次数不超过60次(这是由于乘数不超过2e18,每次乘以2需要60次以覆盖所有可能情况),这样整体复杂度为O(60n),确保算法在时间上是可行的。

解决代码

#include
using namespace std;typedef long long ll;const int N = 2e5 + 5;ll a[N], sum[N], jump[N];ll ans = 0;int main() { ios::sync_with_stdio(false); cin.tie(0); ll n, k; cin >> n >> k; for (int i = 1; i <= n; ++i) { cin >> a[i]; } for (int i = 1; i <= n; ++i) { sum[i] = sum[i-1] + a[i]; } jump[n] = n; jump[n+1] = n+1; for (int i = n-1; i >= 1; --i) { if (a[i] == 1) { jump[i] = jump[i+1]; } else { jump[i] = i; } } for (int i = 1; i <= n; ++i) { ll mul = 1; int last = i; int j = i; while (j <= n && (ll)2e18 / a[j] >= mul) { mul *= a[j]; ll presum = sum[j] - sum[i-1]; if (j == i && mul / presum == k) { ans++; } last = j; j = jump[j+1]; if (mul % k == 0 && (mul / k >= presum && mul / k <= presum + j - last - 1)) { ans++; } } } cout << ans;}

代码主要包含以下几个部分:

  • 输入处理:读取数组长度n和目标值k,然后读取数组a。
  • 前缀和数组计算:计算前缀和数组sum,使区间和快速计算。
  • 跳跃指针数组初始化:跳跃指针用于快速定位区间端点,避免重复计算。
  • 主算法:
    • 遍历每个起始位置i。
    • 计算当前区间的初始乘积和。
    • 使用跳跃指针快速定位终点j。
    • 检查当前区间是否满足条件,如果满足则增加答案计数。
  • 输出结果:打印满足条件的区间个数ans。
  • 转载地址:http://oykiz.baihongyu.com/

    你可能感兴趣的文章
    python可维护性_使用这7大神器,让你的Python 代码更容易于维护
    查看>>
    python变量的详细教程_Python零基础入门教程之语法入门[变量](第二期)
    查看>>
    Python变量命名方法-ChatGPT4o作答
    查看>>
    Python变量与运算符
    查看>>
    Python变量/运算符/函数/模块/string
    查看>>
    python发送邮件的时候出现 error (535, b‘5.7.3 Authentication unsuccessful‘) 解决方法
    查看>>
    python发送notes邮件_使用python在Lotus Notes中发送邮件
    查看>>
    Python双版本下创建一个Scrapy(西瓜皮)项目
    查看>>
    Python双版本下No module named 'requests'
    查看>>
    python及pycharm2018软件安装教程
    查看>>
    python去重txt文本_Python实现的txt文件去重功能示例
    查看>>
    python去掉列表的逗号,从Python列表项中删除标点符号
    查看>>
    Python卸载所有包
    查看>>
    python单线程下实现多个socket并发
    查看>>
    Python单元测试框架介绍(超详细~)
    查看>>
    Python单元测试框架
    查看>>
    python单元测试之unittest
    查看>>
    Python单元测试unittest实战
    查看>>
    Python单元测试-模拟VS补丁
    查看>>
    python协程实时输出_Python 协程以及事件循环的问题,怎么知道 IO 读取结束了呢?...
    查看>>