yi_hr
2025-01-10 09:59:47
对于本题,优先考虑暴力。
暴力:
考虑优化:将问题转化一下,从求第
我们表示一下斜率大于
则我们按照
将同类移到一边:
则对于
我们已经可以实现求斜率为
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int N=1e5+9;
struct node{
int x,y;
bool operator <(const node &a)const{
if(a.x==x) return y>a.y;
return x<a.x;
}
}a[N];
int cqr[N],t[N];
int n,k,cnt;
void ssort(int l,int r){
int mid=(l+r)>>1;
if(l==r)
return;
ssort(l,mid);
ssort(mid+1,r);
int i=l,j=mid+1,k=l;
while(i<=mid&&j<=r){
if(cqr[i]<=cqr[j]){
cnt+=(r-j+1);
t[k++]=cqr[i++];
}
else
t[k++]=cqr[j++];
}
while(i<=mid)
t[k++]=cqr[i++];
while(j<=r)
t[k++]=cqr[j++];
for(int p=l;p<=r;p++)
cqr[p]=t[p];
}
bool check(int p){
for(int i=1;i<=n;i++){
cqr[i]=a[i].y-p*a[i].x;
}
cnt=0;
ssort(1,n);
return cnt>=k;
}
int main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
}
sort(a+1,a+1+n);
int l=-INF,r=INF,ans;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid)){
ans=mid;
l=mid+1;
}else{
r=mid-1;
}
}
cout<<ans;
return 0;
}