lsmCC 发表于 2023-11-13 22:04:45

没有看懂代码是怎么实现的

//给定数组a和整数k,q,a有多少个长度至少为k的连续子数组,其中的元素均不超过q
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
      int n,k,q;
      cin>>n>>k>>q;
      vector<int>a(n);
      for(int j=0;j<n;j++)
      {
            cin>>a;
      }
      vector<int>p;
      p.push_back(-1);
      for(int j=0;j<n;j++)//按照q来分割,那么把大于q的位置都找出来
      {
            if(a>q)
            {
                p.push_back(j);
            }
      }
      p.push_back(n);
      int m=p.size();
      long long ans=0;
      for(int j=0;j<m-1;j++)
      {
            int d=p-p;
            if(d>=k)
            {
                ans+=(long long )(d-k+1)*(d-k)/2;
            }
      }
      cout<<ans<<endl;

    }
}
为什么要把-1和n存入p容器,还有 int d=p-p,为什么要这样写呢

isdkz 发表于 2023-11-13 22:04:52

将-1和n存入p容器是为了标记数组a的起始和结束位置。在这个问题中,我们需要找到数组a中所有长度至少为k的连续子数组,其中的元素均不超过q。因此,我们需要标记数组a的起始和结束位置,以便在计算连续子数组长度时考虑边界情况。

而 int d=p-p 的目的是计算相邻两个分割点之间的距离,即当前分割点和下一个分割点之间的元素个数。这个距离d代表了当前分割点和下一个分割点之间的连续子数组长度。

在这段代码中,我们使用了p容器来存储所有大于q的元素的位置,以便后续计算满足条件的连续子数组个数。

Mike_python小 发表于 2023-11-13 22:06:45

这段代码的目的是计算给定数组 a 和整数 k、q 的情况下,有多少个长度至少为 k 的连续子数组,其中的元素均不超过 q。

- 将 -1 存入向量 p 中的目的是确保在后面的循环中,第一个子数组的起始位置正确。因为 -1 不会出现在原始数组 a 中,所以将其作为起始位置。

- 将数组的长度 n 存入向量 p 中的目的是确保最后一个子数组的结束位置正确。将 n 添加到 p 的末尾,表示最后一个子数组的结束位置。

- int d = p - p; 这行代码的目的是计算相邻元素之间的差值,即表示连续子数组的长度。通过计算 p 和 p 的差值,可以得到连续子数组的长度。

- if (d >= k) 这个条件判断是否满足最小长度要求 k。如果满足条件,说明当前连续子数组的长度大于等于 k。

总结一下,将 -1 和 n 存入向量 p 是为了确保第一个子数组和最后一个子数组的起始位置和结束位置正确。而计算 p - p 的差值则是为了得到连续子数组的长度。

希望可以解答您的疑问,如果还有其他问题,请随时提问。
页: [1]
查看完整版本: 没有看懂代码是怎么实现的