马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
//给定数组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[j];
}
vector<int>p;
p.push_back(-1);
for(int j=0;j<n;j++) //按照q来分割,那么把大于q的位置都找出来
{
if(a[j]>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[j+1]-p[j];
if(d>=k)
{
ans+=(long long )(d-k+1)*(d-k)/2;
}
}
cout<<ans<<endl;
}
}
为什么要把-1和n存入p容器,还有 int d=p[j+1]-p[j],为什么要这样写呢
这段代码的目的是计算给定数组 a 和整数 k、q 的情况下,有多少个长度至少为 k 的连续子数组,其中的元素均不超过 q。
- 将 -1 存入向量 p 中的目的是确保在后面的循环中,第一个子数组的起始位置正确。因为 -1 不会出现在原始数组 a 中,所以将其作为起始位置。
- 将数组的长度 n 存入向量 p 中的目的是确保最后一个子数组的结束位置正确。将 n 添加到 p 的末尾,表示最后一个子数组的结束位置。
- int d = p[j+1] - p[j]; 这行代码的目的是计算相邻元素之间的差值,即表示连续子数组的长度。通过计算 p[j+1] 和 p[j] 的差值,可以得到连续子数组的长度。
- if (d >= k) 这个条件判断是否满足最小长度要求 k。如果满足条件,说明当前连续子数组的长度大于等于 k。
总结一下,将 -1 和 n 存入向量 p 是为了确保第一个子数组和最后一个子数组的起始位置和结束位置正确。而计算 p[j+1] - p[j] 的差值则是为了得到连续子数组的长度。
希望可以解答您的疑问,如果还有其他问题,请随时提问。
|