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. 示例:WPF实现ApplicationCommands.Delete的TextBox

    原文:示例:WPF实现ApplicationCommands.Delete的TextBox 目的:通过模仿TextBox中Ctrl+C等快捷键原理来了解CommandBindings实现原理,可以通过 ...

  2. 两数相加(C#数据结构和算法练习)

    两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...

  3. webpack等bundler是如何工作的-简化版本

    webpack- why and how 首先不要被webpack做的复杂花哨的工作所迷惑,到底webpack是个啥?一句话,webpack是一个module bundler(模块打包器).多一句话, ...

  4. android中实现service动态更新UI界面

    案例:通过service向远程服务器发送请求,根据服务器返回的结果动态更新主程序UI界面,主程序可实时关闭或重启服务. 注册BroadcastReceiver 在主程序activity中注册一个Bro ...

  5. Linux 环境变量配置(Nodejs/MongoDB/JDK/Nginx)

    一.环境变量配置 注:配置环境变量的文件 全局变量(系统级别): /etc/bashrc /etc/profile /etc/environment 用户变量(用户级别): ~/.bash_profi ...

  6. 阿里云ECS-使用putty产品psftp工具上传下载

    本人windows10,安装了winscp3,原本可以简单易用,但天空不作美,死活不让我连接,无奈,只能换命令行方式, 好在,putty提供了一个小工具,psftp,不过,需要去官网下载完整版才有哦, ...

  7. BLE——低功耗蓝牙(Bluetooth Low Energy)

    1.简介 以下蓝牙协议特指低功耗蓝牙协议. 蓝牙协议是由SIG制定并维护的通信协议,蓝牙协议栈是蓝牙协议的具体实现. 各厂商都根据蓝牙协议实现了自己的一套函数库——蓝牙协议栈,所以不同厂商的蓝牙协议栈 ...

  8. XSS简单练习

    xss平台: https://xss.haozi.me题解: https://blog.csdn.net/AlexYoung28/article/details/82315538 对在xss.haoz ...

  9. 彻底理解 Cookie、Session、Token

    发展史 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应, 尤其是我不用记 ...

  10. destoon6.0调用公司设置任意信息的方法-最新

    destoon6.0调用公司设置任意信息的方法 用法: 把以下函数加入到api/extend.func.php 中 function company_setting($userid, $key = ' ...