2^Sort
题面翻译
给你一个长度为 \(n \ (\sum n < 2\cdot 10^5)\) 的数组 \(a\),问你在这个数组中,有多少个长度为 \(k + 1 \ (1\le k < n)\) 的区间,符合以下的条件:
由tzyt翻译
题目描述
Given an array $ a $ of length $ n $ and an integer $ k $ , find the number of indices $ 1 \leq i \leq n - k $ such that the subarray $ [a_i, \dots, a_{i+k}] $ with length $ k+1 $ (not with length $ k $ ) has the following property:
- If you multiply the first element by $ 2^0 $ , the second element by $ 2^1 $ , ..., and the ( $ k+1 $ )-st element by $ 2^k $ , then this subarray is sorted in strictly increasing order.
More formally, count the number of indices $ 1 \leq i \leq n - k $ such that $ $$$2^0 \cdot a_i < 2^1 \cdot a_{i+1} < 2^2 \cdot a_{i+2} < \dots < 2^k \cdot a_{i+k}. $ $$$
输入格式
The first line contains an integer $ t $ ( $ 1 \leq t \leq 1000 $ ) — the number of test cases.
The first line of each test case contains two integers $ n $ , $ k $ ( $ 3 \leq n \leq 2 \cdot 10^5 $ , $ 1 \leq k < n $ ) — the length of the array and the number of inequalities.
The second line of each test case contains $ n $ integers $ a_1, a_2, \dots, a_n $ ( $ 1 \leq a_i \leq 10^9 $ ) — the elements of the array.
The sum of $ n $ across all test cases does not exceed $ 2 \cdot 10^5 $ .
输出格式
For each test case, output a single integer — the number of indices satisfying the condition in the statement.
样例 #1
样例输入 #1
6
4 2
20 22 19 84
5 1
9 5 3 2 1
5 2
9 5 3 2 1
7 2
22 12 16 4 3 22 12
7 3
22 12 16 4 3 22 12
9 3
3 9 12 3 9 12 3 9 12
样例输出 #1
2
3
2
3
1
0
提示
In the first test case, both subarrays satisfy the condition:
- $ i=1 $ : the subarray $ [a_1,a_2,a_3] = [20,22,19] $ , and $ 1 \cdot 20 < 2 \cdot 22 < 4 \cdot 19 $ .
- $ i=2 $ : the subarray $ [a_2,a_3,a_4] = [22,19,84] $ , and $ 1 \cdot 22 < 2 \cdot 19 < 4 \cdot 84 $ .
In the second test case, three subarrays satisfy the condition: - $ i=1 $ : the subarray $ [a_1,a_2] = [9,5] $ , and $ 1 \cdot 9 < 2 \cdot 5 $ .
- $ i=2 $ : the subarray $ [a_2,a_3] = [5,3] $ , and $ 1 \cdot 5 < 2 \cdot 3 $ .
- $ i=3 $ : the subarray $ [a_3,a_4] = [3,2] $ , and $ 1 \cdot 3 < 2 \cdot 2 $ .
- $ i=4 $ : the subarray $ [a_4,a_5] = [2,1] $ , but $ 1 \cdot 2 = 2 \cdot 1 $ , so this subarray doesn't satisfy the condition.
思路:
主要是把公式好好思考一遍,从公式入手,分析前一项和当前项的关系,可以发现a[i]<2a[i+1],所以这道题是求连续区间的满足这个条件且满足区间长度为k+1的这个问题。那么求一段区间连续的和用前缀和来写,我们只要把符合a[i]<2a[i+1]这个条件视为正确1,不满足为0,从k个长度的区间来看,一定有k-1个数对是满足这个需求的。所以这道题主要用前缀和就能搞定。
代码:
#include<iostream>
using namespace std;
int main(){
int t;cin>>t;
while(t--){
int n,x;cin>>n>>x;
int a[n+1],s[n+1];
for(int i=1;i<=n;i++){
cin>>a[i];//读入数据
}
//开始前缀和的预处理
for(int i=1;i<=n;i++){
bool flag=0;
if(a[i]<2*a[i+1]){
flag=1;//为合法数量
}
s[i]=s[i-1]+flag;
}
int ans=0;
//然后统计满足区间的数量
//长度为k+1的区间,实质上满足条件的数对只存在k+1-1个,也就是k个。
for(int i=1;i<=n-x;i++)
if(s[i+k-1]-s[i-1]==x)//i+k-1为右端点,i为左端点,共有i+k-1-i+1=k个数
ans++;
cout<<ans<<endl;
}
}