博客
关于我
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/

    你可能感兴趣的文章
    Transformer 架构解释
    查看>>
    Oracle数据库表空间 数据文件 用户 以及表创建的SQL代码
    查看>>
    oracle数据库零碎---Oracle Merge 使用,表中存在数据就修改,没有数据自动添加
    查看>>
    Oracle数据库验证IMP导入元数据是否会覆盖历史表数据
    查看>>
    oracle数据插入表,oracle同时向多表插入数据
    查看>>
    oracle数据类型和对应的java类型
    查看>>
    【C++进阶篇】——string类的使用
    查看>>
    Oracle未开启审计情况下追踪表变更记录
    查看>>
    Oracle条件查询
    查看>>
    Oracle查看数据库会话连接
    查看>>
    Oracle查询前几条数据的方法
    查看>>
    oracle树形查询 start with connect by
    查看>>
    oracle毕业论文题目,历届毕业论文申报题目大全.doc
    查看>>
    oracle求助---win7下oracle配置相关疑问Starting Oracle Enterprise Manager 10g Database Control ...发生系统错误 5。
    查看>>
    Oracle流程控制语句
    查看>>
    oracle深度解析检查点
    查看>>
    Oracle游标
    查看>>
    oracle游标数最大数,Oracle 最大连接数 最大游标数
    查看>>
    oracle用户改名
    查看>>
    oracle用户解压不了,PLSQL developer 连接不上64位Oracle 的解决方法
    查看>>