链接:戳这里
NanoApe Loves Sequence Ⅱ
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/131072 K (Java/Others)
Problem Description
NanoApe, the Retired Dog, has returned back to prepare for for the National Higher Education Entrance Examination!
In math class, NanoApe picked up sequences once again. He wrote down a sequence with n numbers and a number m on the paper.
Now he wants to know the number of continous subsequences of the sequence in such a manner that the k-th largest number in the subsequence is no less than m.
Note : The length of the subsequence must be no less than k.
Input
The first line of the input contains an integer T, denoting the number of test cases.
In each test case, the first line of the input contains three integers n,m,k.
The second line of the input contains n integers A1,A2,...,An, denoting the elements of the sequence.
1≤T≤10, 2≤n≤200000, 1≤k≤n/2, 1≤m,Ai≤109
Output
For each test case, print a line with one integer, denoting the answer.
Sample Input
1
7 4 2
4 2 7 7 6 5 1
Sample Output
18
思路:
前缀和算出当前位置i前面有多少个数比m大,然后二分区间有多少个数算贡献
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
#include <ctime>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<iomanip>
#include<cmath>
#include<bitset>
#define mst(ss,b) memset((ss),(b),sizeof(ss))
///#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long ll;
typedef long double ld;
#define INF (1ll<<60)-1
#define Max 1e9
using namespace std;
int n,k;
ll m;
ll a[200100];
int sum[200100];
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%I64d%d",&n,&m,&k);
for(int i=1;i<=n;i++) scanf("%I64d",&a[i]);
sum[0]=0;
for(int i=1;i<=n;i++){
if(a[i]>=m) sum[i]=sum[i-1]+1;
else sum[i]=sum[i-1];
}
ll ans=0;
for(int i=1;i+k-1<=n;i++){
int l=i+k-1,r=n,mid,f=-1;
while(l<=r){
mid=(l+r)/2;
if(sum[mid]-sum[i-1]>=k) {
r=mid-1;
f=mid;
}
else l=mid+1;
}
if(f==-1) continue;
else ans+=1LL*(n-f+1);
//printf("%d %d\n",i+k-1,n-f+1);
}
printf("%I64d\n",ans);
}
return 0;
}

本文介绍了一种算法,用于解决求解特定条件下连续子序列的数量问题。输入包含多个测试用例,每个用例由一系列整数组成,目标是找出所有长度不小于k的连续子序列,使得子序列中第k大的数不少于给定值m。
415

被折叠的 条评论
为什么被折叠?



