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

    你可能感兴趣的文章
    POJ 1703 Find them, Catch them 并查集
    查看>>
    POJ 1738 An old Stone Game(石子合并)
    查看>>
    POJ 1740 A New Stone Game(博弈)题解
    查看>>
    Qt网络编程之实例二POST方式
    查看>>
    POJ 1765 November Rain
    查看>>
    poj 1860 Currency Exchange
    查看>>
    POJ 1961 Period
    查看>>
    POJ 2019 Cornfields (二维RMQ)
    查看>>
    poj 2057 The Lost House 贪心思想在动态规划上的应用
    查看>>
    poj 2057 树形DP,数学期望
    查看>>
    poj 2112 最优挤奶方案
    查看>>
    Qt编写自定义控件12-进度仪表盘
    查看>>
    SpringBoot主启动原理在SpringApplication类《第六课》
    查看>>
    poj 2186 Popular Cows :求能被有多少点是能被所有点到达的点 tarjan O(E)
    查看>>
    POJ 2186:Popular Cows Tarjan模板题
    查看>>
    POJ 2229 Sumsets(递推,找规律)
    查看>>
    poj 2236
    查看>>
    POJ 2243 Knight Moves
    查看>>
    POJ 2262 Goldbach's Conjecture
    查看>>
    POJ 2362 Square DFS
    查看>>