Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 599 Accepted Submission(s): 234
php
//m要用long long 啊。 //二分答案x,而後尺取。找到有多少個區間存在至少k個大於等於x的數,若是這樣的區間數很多於m個就說明第m大的數 //比x大,所以有單調性。尺取區間[l,r]中有k個不小於x的數那麼會有n-r+1個符合的區間。 #include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; const int MAXN=100009; int n,k,a[MAXN]; ll m; bool solve(int x) { ll sum=0; int tmp=0,l=1,r=0; while(1){ while(tmp<k){ ++r; if(r>n) break; if(a[r]>=x) tmp++; } if(r>n) break; sum+=(n-r+1); if(a[l]>=x) tmp--; l++; } if(sum>=m) return 1; return 0; } int main() { int t; scanf("%d",&t); while(t--){ scanf("%d%d%lld",&n,&k,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int l=1,r=1e9,ans=0; while(l<=r){ int mid=(l+r)>>1; if(solve(mid)) { ans=mid;l=mid+1; } else r=mid-1; } printf("%d\n",ans); } return 0; }