这题目主要是要能想到使用二分。
其实当你遇到看似无从下手的题目的时候,我们就可以从二分的角度去思考。
这个题目就是二分枚举x,作为数组b里面的第m大的元素,我们可以考虑check a数组里面大于k个x的区间个数,如果这样的区间个数小于m就说明x取大了。
具体见代码
#include typedef long long ll; using namespace std; ll n,m,k; int a[100010]; bool check(int mid) { a[0]=0; ll res=0; ll i=1,right=0,cnt=0; for(i=1;i<=n;i++){ if(a[i-1]>=mid) cnt--; while(right<n && cnt<k){ if(a[++right]>=mid) cnt++; } if(right<=n&&cnt==k) res+=n-right+1; } if(res>=m) return true; return false; } void solve() { scanf("%d%d%d",&n,&k,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int l=1,r=1e9; while(l+1<r) { int mid=(l+r)>>1; if(check(mid)) l=mid; else r=mid; } cout<<l<<endl; } int main() { int t; scanf("%d",&t); while(t--) solve(); return 0; }