CF1692G 2^Sort

2^Sort

题面翻译

给你一个长度为 \(n \ (\sum n < 2\cdot 10^5)\) 的数组 \(a\),问你在这个数组中,有多少个长度为 \(k + 1 \ (1\le k < n)\) 的区间,符合以下的条件:

\[2^0 \cdot a_i < 2^1 \cdot a_{i + 1} < 2^2 \cdot a_{i + 2} < \dotsi < 2^k \cdot a_{i + k}\\ \footnotesize{注:i 为这个区间开始的位置} \]

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值