http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1105
这道题是我去年听说的,一次比赛悲剧的,前几天AC的,大体思路是二分答案,记住在统计的时候,复杂度为n,而不是nlogn,这道题复杂度为 nlog(MAX-MIN)
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define MAXN 51000
__int64 a[MAXN],b[MAXN];
__int64 n,k;
__int64 Count(__int64 x){//统计小于等于x的个数,本题的一个易忽略点,容易写成nlogn
__int64 ret=0;
__int64 j=n-1;
for(__int64 i=0;i<n;i++){
for(;j>=0;)
if(b[j]*a[i]>x)
j--;
else break;
//printf("j=%I64d\n",j);
ret=ret+j+1;
}
return ret;
}
int main(){
while(scanf("%I64d%I64d",&n,&k)!=EOF){
k=n*n-k+1;
for(__int64 i=0;i<n;i++)cin>>a[i]>>b[i];
sort(a,a+n);sort(b,b+n);
__int64 low,mid,high,ans;
low=a[0]*b[0];high=a[n-1]*b[n-1];
while(low<=high){//二分答案,本题关键思路
mid=(low+high)/2;
if(Count(mid)>=k){ans=mid;high=mid-1;}
else low=mid+1;
}
printf("%I64d\n",ans);
}
}