第k小的数 关于二分的离散和连续

先记住吧,还是理解不了

二分的优势在于:哪怕是离散的也可以找到真实存在的

(考虑相同的所以不会用在左侧)
找第k小的=找第一个>=k的是一道可行区在右侧的
但是n+m-k减法太麻烦了
==第一个<mid有k-1个的(我一定是第k小的)变成了可行区在左侧的,

#include <bits/stdc++.h>
using namespace std;
vector<long long>a;
vector<long long>b;
long long k;int n,m;
bool check(long long mid)
{
	int cc=0;
	for(int i=0;i<n;i++)
	{
		for(int j=m-1;j>=0;j--)
		{
			if(a[i]+b[j]<mid) 
			{
				cc+=j+1;break;
			}
		}
	}
	return cc<=k-1;
}
long long find(long long l,long long r)
{
	while(l+1<r)
	{
		long long mid=(l+r)>>1;
		if(check(mid)) l=mid;
		else r=mid;
	}
	return l;
}
int main()
{
	int t;cin>>t;
	while(t--)
	{
		a.clear();b.clear();
		cin>>n>>m>>k;
		int tt=n;int ttt=m;int iii;
		while(tt--)
		{
			cin>>iii;a.push_back(iii);
		}
		while(ttt--)
		{
			cin>>iii;b.push_back(iii);
		}
		sort(a.begin(),a.end());
		sort(b.begin(),b.end());
		long long mn=0;long long mm=a[n-1]+b[m-1];
		long long ans=find(mn,mm);
		cout<<ans<<endl;
	}
}
posted @ 2025-11-26 20:18  ll今天也要加油啊  阅读(0)  评论(0)    收藏  举报