bzoj 2648 SJY摆棋子——KDtree
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2648
第一道KDtree!
学习资料:https://blog.csdn.net/zhl30041839/article/details/9277807
https://www.cnblogs.com/galaxies/p/kdtree.html
这道题的代码是学习(抄)的这里的:https://blog.csdn.net/lych_cys/article/details/50809141
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+,INF=0x3f3f3f3f;
int n,m,fx,rt,ans,tot;
struct Node{
int x[],y[],p[];//x:min y:max p:ps
}a[N>>];
bool cmp(Node u,Node v){return u.p[fx]<v.p[fx];}
struct Kd{
int c[N][];Node s[N],q;//大家的儿子、根和唯一的询问
void add(int cr,Node 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,int now)
{
int mid=l+r>>;fx=now;
nth_element(a+l,a+mid,a+r+,cmp);
// cr=mid;add(cr,a[mid]);//////cr=mid!
cr=++tot;add(cr,a[mid]);
if(l<mid)build(c[cr][],l,mid-,!now);///if()
if(mid<r)build(c[cr][],mid+,r,!now);
pshp(cr);
}
void insert(int &cr,int now)
{
// if(!cr){cr=++n;add(cr,q);return;}//cr=++n!
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 dist(int cr,Node k)//在区域内返回0
{
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,int now)
{
ans=min(ans,abs(s[cr].p[]-q.p[])+abs(s[cr].p[]-q.p[]));
int dl=c[cr][]?dist(c[cr][],q):INF,dr=c[cr][]?dist(c[cr][],q):INF;
if(dl<dr)
{ if(dl<ans)query(c[cr][],!now); if(dr<ans)query(c[cr][],!now);}
else
{ if(dr<ans)query(c[cr][],!now); if(dl<ans)query(c[cr][],!now);}
}
}kd;
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d%d",&a[i].p[],&a[i].p[]);
kd.build(rt,,n,);
for(int i=,op;i<=m;i++)
{
scanf("%d%d%d",&op,&kd.q.p[],&kd.q.p[]);
if(op==) kd.insert(rt,);
else { ans=INF; kd.query(rt,); printf("%d\n",ans);}
}
return ;
}
bzoj 2648 SJY摆棋子——KDtree的更多相关文章
- BZOJ 2648: SJY摆棋子 kdtree
2648: SJY摆棋子 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2648 Description 这天,SJY显得无聊.在家自己玩 ...
- BZOJ 2648 SJY摆棋子 ——KD-Tree
[题目分析] KD-Tree第一题,其实大概就是搜索剪枝的思想,在随机数据下可以表现的非常好NlogN,但是特殊数据下会达到N^2. 精髓就在于估价函数get以及按照不同维度顺序划分的思想. [代码] ...
- bzoj 2648: SJY摆棋子 KDtree + 替罪羊式重构
KDtree真的很妙啊,真的是又好写,作用还多,以后还需更多学习呀. 对于这道题,我们求的是曼哈顿距离的最小值. 而维护的变量和以往是相同的,就是横纵坐标的最小值与最大值. 我们设为一个极为巧妙且玄学 ...
- bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree
2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec Memory Limit: 128 MB Description 这天,S ...
- BZOJ 2648: SJY摆棋子
2648: SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2968 Solved: 1011[Submit][Status][Disc ...
- bzoj 2648: SJY摆棋子【KD-tree】
其实理论上cdq更优 核心是依次取x值.y值的mid作为当前节点,向两边递归建立二叉树,树上维护size:子树大小:mx[0/1]:子树内最大x/y:mn[0/1]:子树内最小x/y:d[0/1]:这 ...
- BZOJ 2648: SJY摆棋子(K-D Tree)
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 6051 Solved: 2113[Submit][Status][Discuss] Descript ...
- bzoj 2648 SJY摆棋子 kd树
题目链接 初始的时候有一些棋子, 然后给两种操作, 一种是往上面放棋子. 另一种是给出一个棋子的位置, 问你离它最近的棋子的曼哈顿距离是多少. 写了指针版本的kd树, 感觉这个版本很好理解. #inc ...
- BZOJ 2648 SJY摆棋子(KD Tree)
http://www.lydsy.com/JudgeOnline/problem.php?id=2648 题意: 思路: KDtree模板题. 参考自http://www.cnblogs.com/ra ...
随机推荐
- Collecting Bugs (概率dp)
Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material stu ...
- ASP获取上月本月下月的第一天和最后一天
上月第一天:<%=dateadd("m",-1,year(date)&"-"&month(date)&"-1" ...
- 使用Imagemagick批量加水印缩小图片的脚本
安装Imagemagick首先要安装Imagemagick 本文HTML永久地址 doc CentOS上安装 yum install ImageMagick -yDebian上安装 apt-get i ...
- 牛客小白月赛1 B 简单题2 【数学】
题目链接 https://www.nowcoder.com/acm/contest/85/B 思路 这个 也是 E AC代码 #include <cstdio> #include < ...
- 【leetcode刷题笔记】Single Number
题目: Given an array of integers, every element appears twice except for one. Find that single one. No ...
- 【leetcode刷题笔记】Remove Duplicates from Sorted List
Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...
- CSS3图片悬停放大动画
在线演示 本地下载
- 《python基础教程(第二版)》学习笔记 列表/元组(第2章)
<python基础教程(第二版)>学习笔记 列表/元组(第2章)序列中的下标从0开始x='ABC' ==> x[0]='A', x[1]='B', x[2]='C'负数索引从右边开始 ...
- Linux下c++11多线程聊天室
刚看的c++11多线程,写个聊天室试试编译的时候加上 c++11 和 多线程库g++ -Wall -std=c++0x -pthread -o server server.cppserver 和cli ...
- Linux课程---1、VMWare安装CentOS虚拟机(安装重要注意)
Linux课程---1.VMWare安装CentOS虚拟机(安装重要注意) 一.总结 一句话总结: 可以先去百度搜一篇对应系统的安装教程:比如 CentOS 7 安装 1.安装VMWare之后,打开w ...