萌新求助为什么这会MLE
查看原帖
萌新求助为什么这会MLE
264490
hmya楼主2022/11/4 17:15
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, k,pos;
struct node
{
    int x, y,id;
} a[250005];
bool cmp(node a, node b)
{
    return a.x < b.x || a.x == b.x && a.y < b.y;
}
bool cmp2(node a,node b){
    return a.y<b.y;
}
int val[250005];
map<int,int> mp;
int findsuf(int x){
    int lt=0,rt=pos+1;
    while(lt+1<rt){
        int mid=lt+rt>>1;
        if(val[mid]>=x){
            rt=mid;
        }
        else{
            lt=mid;
        }
    }
    return rt;
}
int findpre(int x){
    int lt=0,rt=pos+1;
    while(lt+1<rt){
        while(lt+1<rt){
            int mid=lt+rt>>1;
            if(val[mid]>x){
                rt=mid;
            }
            else{
                lt=mid;
            }
        }
    }
    return lt;
}
set<int> st[250005];
priority_queue<int> q;
bool tag;
bool check(int X){
    while(!q.empty())q.pop();
    for(int i=1;i<=pos;i++){
        st[i].clear();
    }
    int lt=1,rt=0;
    int sum=0;
    while(rt<n){
        rt++;
        while(lt<rt&&a[rt].x-a[lt].x>X){
            st[mp[a[lt].y]].erase(a[lt].x);
            lt++;
        }
        int L=findsuf(a[rt].y-X);
        int R=findpre(a[rt].y+X);
        for(int i=L;i<=R;i++){
            for(int v:st[i]){
                if(max(abs(a[rt].y-val[i]),abs(v-a[rt].x))<=X)q.push(-max(abs(a[rt].y-val[i]),abs(v-a[rt].x))),sum++;
            }
        }
        st[mp[a[rt].y]].insert(a[rt].x);
    }
    return sum>=k;
}
signed main()
{
    scanf("%lld%lld", &n, &k);
    for (int i = 1; i <= n; i++)
    {
        scanf("%lld%lld", &a[i].x,&a[i].y);
        int tmpx=a[i].x+a[i].y;
        int tmpy=a[i].x-a[i].y;
        a[i].x=tmpx;
        a[i].y=tmpy;
    }
    sort(a + 1, a + 1 + n, cmp2);
    pos=1;
    val[pos]=a[1].y;
    mp[a[1].y]=pos;
    for(int i=2;i<=n;i++){//
        if(a[i].y!=a[i-1].y){
            pos++;
            mp[a[i].y]=pos;
            val[pos]=a[i].y;
        }
    }
    sort(a+1,a+1+n,cmp);
    while(lt+1<rt){
        int mid=lt+rt>>1;
        if(check(mid)){
            rt=mid;
        }
        else{
            lt=mid;
        }
    }
    tag=true;
    check(rt);
    while(k--){
        printf("%lld\n",-q.top());
        q.pop();
    }
    return 0;
}
2022/11/4 17:15
加载中...