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 ...
随机推荐
- Python菜鸟之路:Python基础-操作缓存memcache、redis
一.搭建memcached和redis 略,自己去百度吧 二.操作Mmecached 1. 安装API python -m pip install python-memcached 2. 启动memc ...
- vue项目创建流程和使用
vue项目的创建 npm run dev 让项目执行起来 #下载vuex npm install vuex --save#下载axiosnpm install axios --save 当我们生成项目 ...
- oracle chain
[oracle@tyger dbs]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on Tue May 6 13:02 ...
- amp模板展示amp网站也可以做得很好看
ytkah比较喜欢研究一些新东西,AMP刚出来的时候就上手了,也做了一些站点,而且还不赖,因为这个还机缘巧合参加了深圳的谷歌全球合作伙伴大会,很多大牛也都来了,很荣幸能和他们一起交流.下面就稍微展示一 ...
- flex 组件重写 组件生命周期
AS方式重写组件常规步骤 1.如果有必要,为组件创建所有基于标记(tag-based)的皮肤(skins) 2.创建ActionScript类文件 ⑴从一个基类扩展,比如UIComponent或者其他 ...
- spring-boot4
1.1.1. Starter pom 除了官方也有其他第三方提供的starter Websocket是服务端推数据到客户端.长连接. 1.1.1.Xml 配置文件 有些时候必须使用xml配置. 1.1 ...
- 在数据库中使用数字ID作为主键的表生成主键方法
在数据库开发中,很多时候建一个表的时候会使用一个数字类型来作为主键,使用自增长类型自然会更方便,只是本人从来不喜欢有内容不在自己掌控之中,况且自增长类型在进行数据库复制时会比较麻烦.所以本人一直使用自 ...
- Idea 包名按树形结构展示
Idea默认包名展示如图: 感觉这样展示,在包下面建包的时候不方便,可以在 设置按钮 里面去掉 Flatten Packages 和 Compact Empty Middle Packages,设置如 ...
- 算法(Algorithms)第4版 练习 1.5.16
Quick-find package com.qiusongde; import edu.princeton.cs.algs4.StdDraw; import edu.princeton.cs.alg ...
- Tomcat处理HTTP请求源码分析(上)
Tomcat处理HTTP请求源码分析(上) 作者 张华 发布于 2011年12月8日 | 8 讨论 分享到: 微博 微信 Facebook Twitter 有道云笔记 邮件分享 稍后阅读 我的阅读清单 ...