1. 程式人生 > >bzoj 5163: 第k大斜率

bzoj 5163: 第k大斜率

www. alc scu long long efi rip calc() eof const

5163: 第k大斜率

Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 15 Solved: 4
[Submit][Status][Discuss]

Description

在平面直角坐標系上,有n個不同的點。任意兩個不同的點確定了一條直線。請求出所有斜率存在的直線按斜率從 大到小排序後,第k條直線的斜率為多少。為了避免精度誤差,請輸出斜率向下取整後的結果。(例如:[1.5]=1, [-1.5]=-2)

Input

第一行,包含兩個正整數n和k。 接下來n行,每行包含兩個整數xi,yi,表示每個點的橫縱坐標。 1 ≤ n≤ 100000 , k ≤ n , |xi|, |yi| ≤ 10^8

Output

輸出一行,包含一個整數,表示第k小的斜率向下取整的結果。

Sample Input

4 1
-1 -1
2 1
3 3
1 4

Sample Output

2 估計正解對於大家來說都很簡單。。。但是這題的題面太坑了。 首先不要輕易相信上述的題面,讓我先來講講我的做題過程。。。。。 1.x坐標相同的是不是算斜率無窮大啊????一開始我這麽想,後來發現x坐標的斜率不算之後能多撐1s多再WA,這說明x坐標相同的不能算。。。 這個還是最不坑啊,,,, 2.你們發沒發現題目的OUTPUT裏寫的是第k小,但是通過觀察樣例和題目描述發現其實是第k大。。。 這個也還好,畢竟寫反了可以看樣例看出來。。。但是最後這個。。。
3.題目裏說k<=n,我一開始還真信了hhhh,後來一直WA一直WA終於想到了n個點最多有n*(n-1)/2條可以計算斜率的直線,所以k開成long long還是好一點。。。 (然後開成long long就A了hhhh,我TM要打死出題人這題面真是沒誰了,估計還要誤導好多人hhhh)
#include<bits/stdc++.h>
#define ll long long
#define maxn 100005
using namespace std;
int l,r,mid,ans;
const int inf=1000000000;
int px[maxn],ky;
struct node{
    int x,y;
    ll tmp;
     
    bool operator <(const node& u)const{
        return tmp==u.tmp?x<u.x:tmp<u.tmp;
    }
}a[maxn];
int n,m,f[maxn];
ll k;
 
inline int query(int x){
    int an=0;
    for(;x;x-=x&-x) an+=f[x];
    return an;
}
 
inline void update(int x,int y){
    for(;x<=ky;x+=x&-x) f[x]+=y;
}
 
inline ll calc(){
    ll an=0;
    memset(f,0,sizeof(f));
     
    for(int i=1;i<=n;i++) a[i].tmp=(ll)a[i].y-mid*(ll)px[a[i].x];
 
    sort(a+1,a+n+1);
     
    for(int i=1;i<=n;i++){
        an+=(ll)query(a[i].x-1);
        update(a[i].x,1);
    }
     
    return an;
}
 
int main(){
    scanf("%d%lld",&n,&k);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&a[i].x,&a[i].y);
        px[i]=a[i].x;
    }
    sort(px+1,px+n+1);
    ky=unique(px+1,px+n+1)-px-1;
    for(int i=1;i<=n;i++) a[i].x=lower_bound(px+1,px+ky+1,a[i].x)-px;
     
    l=-inf,r=inf;
    while(l<=r){
        mid=l+r>>1;
        if(calc()>=k) ans=mid,l=mid+1;
        else r=mid-1;
    }
 
    printf("%d\n",ans);
    return 0;
}

  

bzoj 5163: 第k大斜率