P4169 [Violet]天使玩偶/SJY摆棋子

链接

luogu

思路

luogu以前用CDQ一直过不去。

bzoj还是卡时过去的。

今天终于用k-dtree给过了。

代码

#include <bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f,N=1e6+7;;
const double alph(0.75);
int WD,ans,rub[N],tot,top;
struct Point {
int x[2];
bool operator < (const Point b) const {
return x[WD]<b.x[WD];
}
}p[N];
struct node {
int mi[2],ma[2],ls,rs,siz;
Point tp;
}e[N];
int newnode() {
if(top) return rub[top--];
return ++tot;
}
void up(int u) {
for(int i=0;i<2;++i) {
e[u].mi[i]=e[u].ma[i]=e[u].tp.x[i];
if(e[u].ls) {
e[u].mi[i]=min(e[u].mi[i],e[e[u].ls].mi[i]);
e[u].ma[i]=max(e[u].ma[i],e[e[u].ls].ma[i]);
}
if(e[u].rs) {
e[u].mi[i]=min(e[u].mi[i],e[e[u].rs].mi[i]);
e[u].ma[i]=max(e[u].ma[i],e[e[u].rs].ma[i]);
}
}
e[u].siz=e[e[u].ls].siz+e[e[u].rs].siz+1;
}
int build(int l,int r,int wd) {
if(l>r) return 0;
int u=newnode(),mid=(l+r)>>1;
WD=wd;
nth_element(p+l,p+mid,p+r+1);
e[u].tp=p[mid];
e[u].ls=build(l,mid-1,wd^1);
e[u].rs=build(mid+1,r,wd^1);
up(u);
return u;
}
void pia(int u,int num) {
if(e[u].ls) pia(e[u].ls,num);
p[num+e[e[u].ls].siz+1]=e[u].tp;
rub[++top]=u;
if(e[u].rs) pia(e[u].rs,num+e[e[u].ls].siz+1);
}
void check(int &u,int wd) {
if(alph*e[u].siz<e[e[u].ls].siz||alph*e[u].siz<e[e[u].rs].siz)
pia(u,0),u=build(1,e[u].siz,wd);
}
void insert(Point tmp,int &u,int wd) {
if(!u) {u=newnode(),e[u].tp=tmp;e[u].ls=e[u].rs=0;up(u);return;}
if(e[u].tp.x[wd]<tmp.x[wd]) insert(tmp,e[u].rs,wd^1);
else insert(tmp,e[u].ls,wd^1);
up(u),check(u,wd);
}
int getdis(Point tmp,int u) {
int res=0;
for(int i=0;i<=1;++i)
res+=max(0,e[u].mi[i]-tmp.x[i])+max(0,tmp.x[i]-e[u].ma[i]);
return res;
}
int dis(Point a,Point b) {
return abs(a.x[0]-b.x[0])+abs(a.x[1]-b.x[1]);
}
void query(Point tmp,int u) {
ans=min(ans,dis(e[u].tp,tmp));
int dl=INF,dr=INF;
if(e[u].ls) dl=getdis(tmp,e[u].ls);
if(e[u].rs) dr=getdis(tmp,e[u].rs);
if(dl<dr) {
if(dl<ans) query(tmp,e[u].ls);
if(dr<ans) query(tmp,e[u].rs);
} else {
if(dr<ans) query(tmp,e[u].rs);
if(dl<ans) query(tmp,e[u].ls);
}
}
int main() {
int opt,n,m,rt;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d%d",&p[i].x[0],&p[i].x[1]);
rt=build(1,n,0);
while(m--) {
Point tmp;
scanf("%d%d%d",&opt,&tmp.x[0],&tmp.x[1]);
if(opt==1) insert(tmp,rt,0);
else ans=INF,query(tmp,rt),printf("%d\n",ans);
}
return 0;
}

luoguP4169 [Violet]天使玩偶/SJY摆棋子 K-Dtree的更多相关文章

  1. 洛谷 P4169 [Violet]天使玩偶/SJY摆棋子 解题报告

    P4169 [Violet]天使玩偶/SJY摆棋子 题目描述 \(Ayu\)在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,\(Ayu\) 却忘了她把天使玩偶埋在了哪 ...

  2. [Violet]天使玩偶/SJY摆棋子 [cdq分治]

    P4169 [Violet]天使玩偶/SJY摆棋子 求离 \((x,y)\) 最近点的距离 距离的定义是 \(|x1-x2|+|y1-y2|\) 直接cdq 4次 考虑左上右上左下右下就可以了-略微卡 ...

  3. bzoj2716/2648 / P4169 [Violet]天使玩偶/SJY摆棋子

    P4169 [Violet]天使玩偶/SJY摆棋子 k-d tree 模板 找了好几天才发现输出优化错了....真是zz...... 当子树非常不平衡时,就用替罪羊树的思想,拍扁重建. luogu有个 ...

  4. 【LG4169】[Violet]天使玩偶/SJY摆棋子

    [LG4169][Violet]天使玩偶/SJY摆棋子 题面 洛谷 题解 至于\(cdq\)分治的解法,以前写过 \(kdTree\)的解法好像还\(sb\)一些 就是记一下子树的横.纵坐标最值然后求 ...

  5. 洛谷P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治)

    [Violet]天使玩偶/SJY摆棋子 题目传送门 解题思路 用CDQ分治开了氧气跑过. 将输入给的顺序作为第一维的时间,x为第二维,y为第三维.对于距离一个询问(ax,ay),将询问分为四块,左上, ...

  6. LG4169 [Violet]天使玩偶/SJY摆棋子

    题意 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们把 Ayu 生活的小镇 ...

  7. P4169 [Violet]天使玩偶/SJY摆棋子

    题目背景 感谢@浮尘ii 提供的一组hack数据 题目描述 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅 ...

  8. Luogu P4169 [Violet]天使玩偶/SJY摆棋子

    传送门 二维平面修改+查询,cdq分治可以解决. 求关于某个点曼哈顿距离(x,y坐标)最近的点——dis(A,B) = |Ax-Bx|+|Ay-By| 但是如何去掉绝对值呢? 查看题解发现假设所有的点 ...

  9. [Violet]天使玩偶/SJY摆棋子

    题目 \(KD-tree\)做最近点对的复杂度好像是假的吧,怎么看也看不出来是\(O(\sqrt{n})\)啊 首先\(KD-tree\)长得和平衡树还是很像的,每个节点都存储了一个\(k\)维空间上 ...

随机推荐

  1. PHP7.3.0+弃用FILTER_FLAG_SCHEME_REQUIRED的解决办法

    今天本地调用一个接口报错了: filter_var(): explicit use of FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIR ...

  2. bootstrap-switch使用,small、mini设置

    1.首先需要引用https://www.bootcss.com/p/bootstrap-switch/. bootstrap-switch插件库 2.先引用jquery文件,在引用bootstrap. ...

  3. C#读写设置修改调整UVC摄像头画面-曝光

    有时,我们需要在C#代码中对摄像头的曝光进行读和写,并立即生效.如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的摄像 ...

  4. 为什么要用 redis 而不用 map 做缓存?

    缓存分为本地缓存和分布式缓存.以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例 ...

  5. 记录下hbuilder vue项目打包APP 在IOS上点击延迟的问题

    做的项目打包成APP在IOS 上有延迟问题,在安卓下却不会,联想到之前 用IONIC时打包的APP也是 在IOS下有300毫秒延迟问题.所以 只能 认吧. 安装fastclick 插件: npm in ...

  6. 面试题:java内存中的堆区和数据结构中的堆有什么区别

    java内存中的堆是一个  链表, 数据结构中的堆:就是一个栈

  7. BERT解析及文本分类应用

    目录 前言 BERT模型概览 Seq2Seq Attention Transformer encoder部分 Decoder部分 BERT Embedding 预训练 文本分类试验 参考文献 前言 在 ...

  8. HttpUtils请求工具类

    package com.cmcc.hybj.payment.framework.https; import java.io.UnsupportedEncodingException;import ja ...

  9. html, js,css应用文件路径规则

    web前端一般常用文件 .html .css .js.但是当用css文件和html引入资源(比如图片)时,路径可能不相同.下面总结了几条. 使用相对路径引入规则: html或者js引入图片,按照htm ...

  10. SPRINGBOOT注解最全详解(

    #     SPRINGBOOT注解最全详解(整合超详细版本)          使用注解的优势:               1.采用纯java代码,不在需要配置繁杂的xml文件           ...