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 ...
随机推荐
- 石子合并DP
DP Time Limit:3000MS Memory Limit:131072KB 64bit IO Format:%lld & %llu Submit Status Pra ...
- java Web程序使用wro4j合并、压缩js、css等静态资源
在Web项目中,js.css合并压缩,不仅有利于减少Http请求数量.减少宽带资源占用,还能有效的管理各种js.css的引入,使整个项目更加有序.而对于访问用户来说,其更大的好处是增加了页面的打开速度 ...
- 栈 堆 stack heap
点餐 做菜 Stack and Heap 堆和栈的区别 - Grandyang - 博客园 https://www.cnblogs.com/grandyang/p/4933011.html 在和计算机 ...
- output value . Sigmoid neurons are similar to perceptrons, but modified so that small changes in their weights and bias cause only a small change in their output.
http://neuralnetworksanddeeplearning.com/chap1.html . Sigmoid neurons are similar to perceptrons, bu ...
- 从分布式锁来看redis和zookpeer!
从分布式锁来看redis和zookpeer! 目前网上大部分的基于zookpeer,和redis的分布式锁的文章都不够全面.要么就是特意避开集群的情况,要么就是考虑不全,读者看着还是一脸迷茫.坦白说, ...
- onActivityResult方法不执行,什么原因?
原因: public void OnOpenPlayersActivity(View view) { Intent intent = new Intent(); intent.setClass(g ...
- migrate
数据类型 引用 # :string, :text, :integer, :float,:decimal, :datetime, :timestamp, :time, :date, # :binary, ...
- deviceToken的获取(一)
1.获得deviceToken的过程 1>客户端向苹果服务APNS,发送设备的UDID和英语的Bundle Identifier.2>经苹果服务器加密生成一个deviceToken ...
- ios中文模糊搜索兼容问题
$(function(){ var cpLock = true; $("input[name='name']").off().on({ compositionstart: func ...
- CSS知识点 2
回顾: 浮动:是css中布局最多的一个属性 有浮动,一定要清除浮动浮动不是一个元素单独浮动,要浮动一起浮动 清除浮动四种方式:1.给父盒子添加高度,一般导航栏2.给浮动元素后面加一个空的块标签, 并 ...