题目地址:点这里
在10^5 *10^ 5 这样一个数组点对里面。 找第k个数。
1 2147483647 10^9 啊 long long...
2 直接排序以后取出来第k个是不科学的,我们可以在o(n) 时间内找到。
先用map保存出现的次数。
然后,先确定第一维,确定了以后,减去前面的基,就是在这一个维度里面的偏移量。
代码:
#include<iostream>
#include<map>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long inta;
inta p[100005];
inta sum[100005];
map<inta,inta> mp;
int main()
{
inta n,k;
cin>>n>>k;
for(int i=0;i<n;i++)
{
scanf("%lld",&p[i]);
mp[p[i]]++;
}
sort(p,p+n);
inta d=unique(p,p+n)-p;
for(int i=0;i<d;i++)
{
sum[i]=mp[p[i]];
if(i) sum[i]+=sum[i-1];
}
//
// for(int i=0;i<d;i++)
// cout<<sum[i]<<endl;
//
// for(int i=0;i<d;i++)
// cout<<p[i]<<endl;
int first=0;
for(int i=0;i<d;i++)
{
if(k-1<sum[i]*n)
{
first=i;
break;
}
// if(k-1>=sum[i]*n&&k-1<sum[i+1]*n)
// {
// //cout<<"jingqi";
// first=p[i+1];
// break;
// }
}
if(first) k-=sum[first-1]*n;
int second=0;
for(int i=0;i<d;i++)
{
if(k-1<sum[i]*mp[p[first]])
{
second=i;
break;
}
}
cout<<p[first]<<' '<<p[second]<<endl;
}