标签:
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5806
题意:有多少个区间里的第 k 大的数不小于 m
解法:尺取法,首先我们用dp[i]保存到i的位置有多少大于m的数
l=1,r=1,r开始遍历,只要符合dp[l]-dp[r]==k就是sum+=(n-r+1)
然后根据情况移动l,r
#include<stdio.h> //#include<bits/stdc++.h> #include<string.h> #include<iostream> #include<math.h> #include<sstream> #include<set> #include<queue> #include<map> #include<vector> #include<algorithm> #include<limits.h> #define inf 0x3fffffff #define INF 0x3f3f3f3f #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define LL long long #define ULL unsigned long long using namespace std; long long n,m,k; long long a[100005]; long long q,p; long long b[100005],e[100005],c[100005]; long long dp[200005]; long long sum=0; int t; long long MAXN1,MAXN2; int main() { scanf("%d",&t); while(t--) { sum=0; int j=0; memset(dp,0,sizeof(dp)); scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } for(int i=1;i<=n;i++) { if(a[i]>=m) { dp[i]=dp[i-1]+1; } else { dp[i]=dp[i-1]; } // cout<<dp[i]<<"A"<<endl; } int i=1; while(i<=n) { while(dp[i]-dp[j]==k) { sum+=(n-i+1); j++; } i++; } printf("%lld\n",sum); } return 0; }
标签:
原文地址:http://www.cnblogs.com/yinghualuowu/p/5745047.html