可持久化线段树40分求调
查看原帖
可持久化线段树40分求调
983519
Laisira楼主2024/5/24 17:14
#include <iostream>
#include<algorithm>
#define int long long 
#define Lson lson[x],l,mid,lson[u] 
#define Rson rson[x],mid+1,r,rson[u] 
#define Maxn 100005 
using namespace std;
struct Member{int x,y;} e[Maxn];
int s[Maxn],d[Maxn];
int lson[Maxn<<6],rson[Maxn<<6],t[Maxn<<6],tot;
void Merge(int &x,int l,int r,int u,int p) {
    x=++tot;
    lson[x]=lson[u],rson[x]=rson[u];
    t[x]=t[u]+1;
    if(l == r)return ;
    int mid=(l+r)>>1;
    if(p<=s[mid])Merge(Lson,p);
    else Merge(Rson,p);
}
int query(int x,int l,int r,int u,int L,int R) {
    if(L<=s[l]&&s[r]<=R)return t[x]-t[u];
    int mid=(l+r)>>1,ans=0;
    if(L<=s[mid])ans+=query(Lson,L,R);
    if(s[mid+1]<=R)ans+=query(Rson,L,R);
    return ans;
}
bool cmp(int it,int is) {
    return it<is;
}
int rt[Maxn];
int n,k;
int check(int z) {
    int ans=0;
    for(int i=1;i<=n;i++)
        d[i]=s[i]=e[i].y-z*e[i].x;
    sort(s+1,s+1+n,cmp);
    // for(int i=1;i<=n;i++)
    //     cout<<s[i]<<" ";cout<<"\n";
    rt[0]=lson[0]=rson[0]=t[0]=tot=0;
    for(int i=1;i<=n;i++)
        Merge(rt[i],1,n,rt[i-1],d[i]),
        ans+=((d[i]!=s[1])?query(rt[i],1,n,rt[0],s[1],d[i]-1):0);
        // cout<<e[i].x<<" "<<i<<" "<<d[i]<<" "<<ans<<" __\n";
    // cout<<"\n";
    return ans;
}
bool cmp0(Member it,Member is) {
    return it.x<is.x;
}
signed main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>e[i].x>>e[i].y;
    sort(e+1,e+1+n,cmp0);
    int l=-200000000,r=200000000,mid,ans;
    while(l <= r) {
        mid=(l+r)>>1;
        int op=check(mid);
        // cout<<l<<" "<<r<<" "<<mid<<" "<<op<<"\n";
        if(op>=k)l=mid+1,ans=mid;
        else r=mid-1;
    } cout<<ans;
}
2024/5/24 17:14
加载中...