题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2716

第三道KDtree!仍旧是模板。还有CDQ分治做法,见下面。

数组迷之开大?(开6e5+5还不行)

原来query( )只用传一个根。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=3e6+,INF=0x3f3f3f3f;
int n,m,ans,rt,tot;
bool fx;
struct Dt{
int x[],y[],p[];
}a[N>>];
bool cmp(Dt u,Dt v){return u.p[fx]<v.p[fx];}
struct KD{
int c[N][]; Dt s[N],q;
void add(int cr,Dt k)
{ for(int i=;i<=;i++) s[cr].x[i]=s[cr].y[i]=s[cr].p[i]=k.p[i];}
void pshp(int cr)
{
int ls=c[cr][],rs=c[cr][];
for(int i=;i<=;i++)
{
if(ls) s[cr].x[i]=min(s[cr].x[i],s[ls].x[i]),
s[cr].y[i]=max(s[cr].y[i],s[ls].y[i]);
if(rs) s[cr].x[i]=min(s[cr].x[i],s[rs].x[i]),
s[cr].y[i]=max(s[cr].y[i],s[rs].y[i]);
}
}
void build(int &cr,int l,int r,bool now)
{
int mid=l+r>>; fx=now; nth_element(a+l,a+mid,a+r+,cmp);
cr=++tot; add(cr,a[mid]);
if(l<mid) build(c[cr][],l,mid-,!now);
if(mid<r) build(c[cr][],mid+,r,!now);
pshp(cr);
}
void insert(int &cr,bool now)
{
if(!cr){cr=++tot; add(cr,q); return;}
if(q.p[now]<s[cr].p[now]) insert(c[cr][],!now);
else insert(c[cr][],!now);
pshp(cr);
}
int dis(int cr,Dt k){return abs(s[cr].p[]-k.p[])+abs(s[cr].p[]-k.p[]);}
int dist(int cr,Dt k)
{
int ret=;
for(int i=;i<=;i++)
ret+=max(,s[cr].x[i]-k.p[i])+max(,k.p[i]-s[cr].y[i]);
return ret;
}
void query(int cr)
{
ans=min(ans,dis(cr,q));
int ls=c[cr][],rs=c[cr][];
int dl=(ls?dist(ls,q):INF),dr=(rs?dist(rs,q):INF);
if(dl<dr) {if(dl<ans) query(ls); if(dr<ans) query(rs);}
else {if(dr<ans) query(rs); if(dl<ans) query(ls);}
}
}kd;
int rdn()
{
int ret=;char ch=getchar();
while(ch>''||ch<'') ch=getchar();
while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'', ch=getchar();
return ret;
}
int main()
{
n=rdn(); m=rdn();
for(int i=;i<=n;i++) a[i].p[]=rdn(), a[i].p[]=rdn();
kd.build(rt,,n,);
for(int i=,op;i<=m;i++)
{
op=rdn();kd.q.p[]=rdn();kd.q.p[]=rdn();
if(op==) kd.insert(rt,);
else { ans=INF; kd.query(rt); printf("%d\n",ans);}
}
return ;
}

CDQ分治做法可看看这个人的博客:https://www.cnblogs.com/longshengblog/p/5511593.html

  大约就是算距离的时候用 (x+y)-(x'+y') ,(x'<x,y'<=y) 。但只是这样只能算左下角的;所以用maxx-x作为新的x,y还是原来的,就能算右下角;用maxy-y作为新的y,x还是原来的,就能算左上角;x和y都减了,就能算右上角。那个博客的实现很简洁,所以自己就懒得写了(?)。

bzoj 2716 [Violet 3]天使玩偶——KDtree的更多相关文章

  1. BZOJ 2716 [Violet 3]天使玩偶 ——KD-Tree

    [题目分析] KD-Tree的例题.同BZOJ2648. [代码] #include <cstdio> #include <cstring> #include <cstd ...

  2. bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree

    2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec  Memory Limit: 128 MB Description 这天,S ...

  3. BZOJ 2716: [Violet 3]天使玩偶

    2716: [Violet 3]天使玩偶 Time Limit: 80 Sec  Memory Limit: 128 MBSubmit: 1473  Solved: 621[Submit][Statu ...

  4. BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )

    先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了. --------------------------------- ...

  5. BZOJ 2716 Violet 3 天使玩偶 CDQ分治

    题目大意:初始给定平面上的一个点集.提供两种操作: 1.将一个点增加点集 2.查询距离一个点最小的曼哈顿距离 K-D树是啥...不会写... 我仅仅会CDQ分治 对于一个询问,查询的点与这个点的位置关 ...

  6. bzoj 2716 [Violet 3]天使玩偶 【CDQ分治】

     KD-tree可做,但是我不会暂时不考虑 大意:在二维平面内,给定n个点,m个操作.操作A:加入一个点:操作B:询问一个点与平面上加入的点的最近距离 不封装会T不封装会T不封装会T不封装会T不封装会 ...

  7. BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个 ...

  8. BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶

    BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...

  9. 【BZOJ】2648: SJY摆棋子 & 2716: [Violet 3]天使玩偶(kdtree)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2716 http://www.lydsy.com/JudgeOnline/problem.php?id ...

随机推荐

  1. 第一章 MATLAB数字图像处理编程基础

    1 为什么用MATLAB MATLAB的图像处理工具箱(Image Processing Toolbox,IPT)封装了一系列不同图像处理需求的标准算法,它们都是通过直接或间接调用MATLAB中矩阵运 ...

  2. 加密php源代码

    <?php function RandAbc($length = "") { //返回随机字符串 $str = "ABCDEFGHIJKLMNOPQRSTUVWXY ...

  3. font awesome (图标字体库)

    Font Awesome fa是什么? 图标字体库和CSS框架 怎么用? <link rel="stylesheet" href="https://cdn.boot ...

  4. [php]Maximum function nesting level of '100' reached错误

    今天在做后台一个模块的时候报出了这个错误. Maximum function nesting level of '100' reached 仔细分析之后发现是在类的初始化过程中(__construct ...

  5. Django 之 缓存机制

    Django 缓存机制 缓存介绍 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次 ...

  6. Android Interactive Animation

    Ref:收集android上开源的酷炫的交互动画和视觉效果:Interactive-animation Ref:界面特效 Ref:BaseAnimation是基于开源的APP,致力于收集各种动画效果( ...

  7. 找出旋转有序数列的中间值python实现

    题目给出一个有序数列随机旋转之后的数列,如原有序数列为:[0,1,2,4,5,6,7] ,旋转之后为[4,5,6,7,0,1,2].假定数列中无重复元素,且数列长度为奇数.求出旋转数列的中间值.如数列 ...

  8. HackerRank - camelcase 【字符串】

    思路 找单词 第一个 单词 是小写 然后 后面的单词 第一位 都是大写 刚开始 初始化 ans = 1 然后 往后遍历 碰到 大写的 更新答案 AC代码 #include <cstdio> ...

  9. 一、Perfect Squares 完全平方数

    一原题 Given a positive integer n, find the least number of perfect square numbers (, , , , ...) which ...

  10. 第三篇、javascript整数和字符串

    一.整数 JavaScript中不区分整数值和浮点数值,JavaScript中所有数字均用浮点数值表示. 转换: parseInt(..)    将某值转换成数字,不成功则NaN parseFloat ...