【bzoj4520】K远点对

Portal --> bzoj4520

Description

  给你平面内\(n\)个点的坐标,求欧氏距离下第\(k\)远的点对

Solution

  因为kd其实。。严格来说挺不熟的用的太少了qwq

  然后不知道为啥第一反应凸包直径取\(k\)次qwq然而这样有一个问题就是。。取完一次之后删点不知道要删直径中两个点中的哪一个,所以。。不太靠谱

  正解应该是kd-tree

  其实这题挺暴力的,时间复杂度也很玄学(不会算qwq)貌似kd的题复杂度就没有不玄学的。。

  因为不知道答案是哪两个点,初步的想法是我们干脆维护一个大小为\(k\)的小根堆,对于每一个点,都在kd-tree里面查以其作为两个点之一的点对的前\(k\)大距离,如果说比小根堆的堆顶更优那就用当前的结果把小根堆的堆顶替换掉,这样对每一个点都操作一遍之后,堆顶就是答案了

​  然而实际上,我们会发现一个点对会被计算两次,所以我们其实应该维护一个\(k*2\)的堆,查找也是\(k*2\)而不是\(k\)

  再稍微具体一点的话在kd中查找的流程大概是这样的:

1、计算当前点与固定点的距离,如果比堆顶优就替换

2、用一个估值函数分别计算两个子树的可能最远距离\(lval\)\(rval\)

3、如果说\(lval>rval\)则优先遍历左子树,否则优先遍历右子树

4、遍历一个子树的前提条件是:当前堆中不足\(k*2\)个元素或者该子树的估值函数返回值优于堆顶

  接下来就是这个估值函数要怎么写了:

  (这里提供的这种写法比较。。水。。其实如果有心去卡的话貌似是可以卡掉的qwq)

  我们考虑分别记录该子树内的\(x\)的最大最小值和\(y\)的最大最小值,然后估值函数就返回\(x\)的最大最小值与固定点的\(x\)的最大差值的平方+\(y\)的最大最小值与固定点的\(y\)的最大差值的平方,这样我们就能得到一个最优情况下的最大值了

  

  代码大概长这个样子

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const int N=100010,inf=2147483647;
int which;
ll sqr(ll x){return x*x;}
struct Dot{
    int data[2];
    Dot(){}
    Dot(int x,int y){data[0]=x; data[1]=y;}
    friend ll dis(Dot a,Dot b){return sqr(a.data[0]-b.data[0])+sqr(a.data[1]-b.data[1]);}
    friend bool operator < (Dot a,Dot b){return a.data[which]<b.data[which];}
}a[N];
int n,k,tot;
bool cmp(ll x,ll y){return x>y;}
priority_queue<ll,vector<ll>,greater<ll> > q;
namespace Kd{/*{{{*/
    int ch[N][2],mnx[N],mxx[N],mny[N],mxy[N];
    int rt;
    void pushup(int x){
        mxx[x]=mnx[x]=a[x].data[0]; mxy[x]=mny[x]=a[x].data[1];
        if (ch[x][0]){
            mxx[x]=max(mxx[x],mxx[ch[x][0]]);
            mxy[x]=max(mxy[x],mxy[ch[x][0]]);
            mnx[x]=min(mnx[x],mnx[ch[x][0]]);
            mny[x]=min(mny[x],mny[ch[x][0]]);
        }
        if (ch[x][1]){
            mxx[x]=max(mxx[x],mxx[ch[x][1]]);
            mxy[x]=max(mxy[x],mxy[ch[x][1]]);
            mnx[x]=min(mnx[x],mnx[ch[x][1]]);
            mny[x]=min(mny[x],mny[ch[x][1]]);
        }
    }
    int _build(int l,int r,int now){
        if (l>r) return 0;
        int mid=l+r>>1;
        which=now;
        nth_element(a+l,a+mid,a+r+1);
        ch[mid][0]=_build(l,mid-1,now^1);
        ch[mid][1]=_build(mid+1,r,now^1);
        pushup(mid);
        return mid;
    }
    ll val(int x,Dot &delta){
        if (!x) return -1;
        ll ret=max(sqr(delta.data[0]-mnx[x]),sqr(delta.data[0]-mxx[x]))+
               max(sqr(delta.data[1]-mny[x]),sqr(delta.data[1]-mxy[x]));
        return ret;
    }
    void build(int n){rt=_build(1,n,0);}
    void _query(int x,int k,Dot &delta){
        if (!x) return;
        ll d=dis(delta,a[x]),lval=val(ch[x][0],delta),rval=val(ch[x][1],delta);
        if (q.size()<k) q.push(d);
        else{
            if (d>q.top())
                q.pop(),q.push(d);
        }
        if (lval>rval){
            if (lval>q.top()||q.size()<k) _query(ch[x][0],k,delta);
            if (rval>q.top()||q.size()<k) _query(ch[x][1],k,delta);
        }
        else{
            if (rval>q.top()||q.size()<k) _query(ch[x][1],k,delta);
            if (lval>q.top()||q.size()<k) _query(ch[x][0],k,delta);
        }
    }
    void query(Dot &delta,int k){_query(rt,k,delta);}
}/*}}}*/

int main(){
#ifndef ONLINE_JUDGE
    freopen("2.in","r",stdin);
#endif
    scanf("%d%d",&n,&k);
    for (int i=1;i<=n;++i)
        scanf("%d%d",&a[i].data[0],&a[i].data[1]);
    k*=2;
    Kd::build(n);
    tot=0;
    for (int i=1;i<=n;++i) Kd::query(a[i],k);
    printf("%lld\n",q.top());
}

转载于:https://www.cnblogs.com/yoyoball/p/9351210.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值