Atcoder ABC155

D - Pairs
题意:
给你n个数,一共有n(n-1)个乘积,求第k大的数是多少。
n最大有2e5
思路:
二分里面套二分

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 +7;
const ll MAXN = 1e6 + 5;

ll n,k;
ll a[MAXN];
//判断在当前的数之前有多少个数
ll check(ll x){
	ll res=0;
	for(int i=0;i<n;i++){
		if(a[i]<0){
			ll L=i,R=n;
			while(R-L>1){
				ll mid=L+R>>1;
				if(a[i]*a[mid]<=x){//这里要注意和下面不一样的是 当a[i]<0的时候mid取小 乘积反而会增大
					R=mid;
				}else{
					L=mid;
				}
			}
			res+=n-R;
		}else{
			ll L=i,R=n;
			while(R-L>1){
				ll mid=L+R>>1;
				if(a[i]*a[mid]<=x){//a[i]>0 mid取大 乘积增大
					L=mid;
				}else{
					R=mid;
				}
			}
			res+=L-i;
		}
	}
	return res;
}


int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>k;
	for(int i=0;i<n;i++) cin>>a[i];
	sort(a,a+n);
	ll L=-1e18,R=1e18;
	while(R-L>1){
		ll Mid=L+R>>1;
		if(check(Mid)<k){
			L=Mid;
		}else{
			R=Mid;
		}
	}
	cout<<R;
	return 0;
}

发布了35 篇原创文章 · 获赞 4 · 访问量 4291

猜你喜欢

转载自blog.csdn.net/Meulsama/article/details/104505753