题目:点击打开链接
题意:
有很多子区间,问你子区间第二大取出来,组成数组的第k大是多少。
和hdu 6231 一样。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+30;
int a[maxn],b[maxn];
ll n,k;
ll check(int x){
int cnt=0,r=-1,l=0;
ll sum=0;
while(r<n){
if(cnt<2){
r++;
if(a[r]>=x)
cnt++;
}
else{
sum+=(n-r);
if(a[l]>=x)
cnt--;
l++;
}
}
return sum;
}
int main(){
int t;
cin>>t;
while(t--){
scanf("%lld%lld",&n,&k); //写成%d wa一发。。
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b,b+n);
int l=0,r=n-1;
ll ans=0;
while(l<=r){
int mid=(l+r)>>1;
int t=b[mid];
if(check(t)>=k){
ans=t;
l=mid+1;
}
else
r=mid-1;
}
cout<<ans<<endl;
}
return 0;
}