[bzoj2648/2716]SJY摆棋子

本文介绍了一种使用K-D树进行平面上点集最近邻查询的方法。通过构建K-D树来组织点集数据,实现了点的快速插入与最近邻查询功能。文章提供了一个具体的C++实现示例,可用于解决点集查询问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平面上有n个点,要求支持插入一个点和查询一个点的最近点距离 n,m<=500000

用kdtree实现,但是复杂度貌似没法保证.....(莫名加了替罪羊重建更慢了...)

#include<iostream>
#include<cstdio>
#include<algorithm>
#define INF 2000000000
#define MN 1000000
using namespace std;
inline int read()
{
    int x = 0 , f = 1; char ch = getchar();
    while(ch < '0' || ch > '9'){ if(ch == '-') f = -1;  ch = getchar();}
    while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}
    return x * f;
}
int n,now,m;
inline int abs(int x){return x<0?-x:x;}
struct P{
    int d[2],mx[2],mn[2],l,r;
    int& operator[](int x){return d[x];}
    bool operator<(const P&x)const{return d[now]<x.d[now];}
    friend int dis(P x,P y){return abs(x.d[0]-y.d[0])+abs(x.d[1]-y.d[1]);}
}t[MN+5];

struct KD_TREE{
    P p[MN+5],T;int ans;
    void update(int x)
    {
        int l=p[x].l,r=p[x].r;
        for(int i=0;i<2;i++)
        {
            if(l) p[x].mn[i]=min(p[x].mn[i],p[l].mn[i]),
                  p[x].mx[i]=max(p[x].mx[i],p[l].mx[i]);
            if(r) p[x].mn[i]=min(p[x].mn[i],p[r].mn[i]),
                  p[x].mx[i]=max(p[x].mx[i],p[r].mx[i]);
        }
    }
    void ins(int x,int th)
    {
        if(T[th]>=p[x][th])
        {
            if(p[x].r) ins(p[x].r,th^1);
            else 
            {
                int r=p[x].r=++n;p[r]=T;
                for(int i=0;i<2;i++)
                    p[r].mn[i]=p[r].mx[i]=T[i];
            }
        }
        else
        {
            if(p[x].l) ins(p[x].l,th^1);
            else
            {
                int l=p[x].l=++n;p[l]=T;
                for(int i=0;i<2;i++)
                    p[l].mn[i]=p[l].mx[i]=T[i];
            }
        }
        update(x);
    }
    int getmn(P x)
    {
        int sum=0;
        for(int i=0;i<2;i++)
        {
            sum+=max(x.mn[i]-T[i],0);
            sum+=max(T[i]-x.mx[i],0); 
        }
        return sum;
    }
    int build(int l,int r,int th)
    {
        int mid=l+r>>1;now=th;
        nth_element(t+l,t+mid,t+r+1);
        p[mid]=t[mid];
        for(int i=0;i<2;i++)
            p[mid].mx[i]=p[mid].mn[i]=p[mid][i];
        if(l<mid) p[mid].l=build(l,mid-1,th^1);
        if(mid<r) p[mid].r=build(mid+1,r,th^1);
        update(mid);
        return mid;
    }
    void querymn(int k)
    {
        ans=min(ans,dis(p[k],T));
        int dl=INF,dr=INF;
        if(p[k].l) dl=getmn(p[p[k].l]);
        if(p[k].r) dr=getmn(p[p[k].r]);    
        if(dl>dr)
        {    
            if(dr<ans) querymn(p[k].r);
            if(dl<ans) querymn(p[k].l);
        }
        else 
        {
            if(dl<ans) querymn(p[k].l);
            if(dr<ans) querymn(p[k].r);
        }
    }
}kd;
int rt,ans=INF;

int main()
{
    n=read();m=read();
    for(int i=1;i<=n;i++)
        t[i][0]=read(),t[i][1]=read();
    rt=kd.build(1,n,0);
    for(int i=1;i<=m;i++)
    {
        int op=read();kd.T[0]=read();kd.T[1]=read();
        if(op==1) kd.ins(rt,0);
        else 
        {
            kd.ans=INF;kd.querymn(rt);
            printf("%d\n",kd.ans);
        }
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/FallDream/p/bzoj2648.html

电动汽车数据集:2025年3K+记录 真实电动汽车数据:特斯拉、宝马、日产车型,含2025年电池规格和销售数据 关于数据集 电动汽车数据集 这个合成数据集包含许多品牌和年份的电动汽车和插电式车型的记录,捕捉技术规格、性能、定价、制造来源、销售和安全相关属性。每一行代表由vehicle_ID标识的唯一车辆列表。 关键特性 覆盖范围:全球制造商和车型组合,包括纯电动汽车和插电式混合动力汽车。 范围:电池化学成分、容量、续航里程、充电标准和速度、价格、产地、自主水平、排放、安全等级、销售和保修。 时间跨度:模型跨度多年(包括传统和即将推出的)。 数据质量说明: 某些行可能缺少某些字段(空白)。 几个分类字段包含不同的、特定于供应商的值(例如,Charging_Type、Battery_Type)。 各列中的单位混合在一起;注意kWh、km、hr、USD、g/km和额定值。 列 列类型描述示例 Vehicle_ID整数每个车辆记录的唯一标识符。1 制造商分类汽车品牌或OEM。特斯拉 型号类别特定型号名称/变体。型号Y 与记录关联的年份整数模型。2024 电池_类型分类使用的电池化学/技术。磷酸铁锂 Battery_Capacity_kWh浮充电池标称容量,单位为千瓦时。75.0 Range_km整数表示充满电后的行驶里程(公里)。505 充电类型主要充电接口或功能。CCS、NACS、CHAdeMO、DCFC、V2G、V2H、V2L Charge_Time_hr浮动充电的大致时间(小时),上下文因充电方法而异。7.5 价格_USD浮动参考车辆价格(美元).85000.00 颜色类别主要外观颜色或饰面。午夜黑 制造国_制造类别车辆制造/组装的国家。美国 Autonomous_Level浮点自动化能力级别(例如0-5),可能包括子级别的小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值