BZOJ2648 SJY摆棋子(KD-Tree)
板子题。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 1000010
#define inf 2000000000
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,root,cnt,c,ans;
struct point
{
int d[],tag;
bool operator <(const point&a) const
{
return d[c]<a.d[c];
}
}a[N];
struct KDTree{int ch[],a[][],tag;point p;
}tree[N];
struct data{int op;point p;
}q[N];
inline int dis(point u,point v){return abs(u.d[]-v.d[])+abs(u.d[]-v.d[]);}
inline void chkmin(int &x,int y){x=min(x,y);}
inline void chkmax(int &x,int y){x=max(x,y);}
inline bool isin(point x,int a[][]){return a[][]<=x.d[]&&a[][]>=x.d[]&&a[][]<=x.d[]&&a[][]>=x.d[];}
inline int max(int x,int y,int z){return max(max(x,y),z);}
inline int guess(point x,int a[][]){return max(,a[][]-x.d[],x.d[]-a[][])+max(,a[][]-x.d[],x.d[]-a[][]);}
void build(int &k,int l,int r,int op)
{
if (l>r) return;
k=++cnt;c=op;int mid=l+r>>;
nth_element(a+l,a+mid,a+r+);
tree[k].p=a[mid],tree[k].tag=a[mid].tag,
tree[k].a[][]=tree[k].a[][]=a[mid].d[],
tree[k].a[][]=tree[k].a[][]=a[mid].d[];
for (int i=l;i<=r;i++)
chkmin(tree[k].a[][],a[i].d[]),chkmax(tree[k].a[][],a[i].d[]),
chkmin(tree[k].a[][],a[i].d[]),chkmax(tree[k].a[][],a[i].d[]);
build(tree[k].ch[],l,mid-,op^);
build(tree[k].ch[],mid+,r,op^);
}
void ins(int k,point x)
{
if (!k) return;
if (tree[k].p.d[]==x.d[]&&tree[k].p.d[]==x.d[]) {tree[k].tag=;return;}
if (isin(x,tree[tree[k].ch[]].a)) ins(tree[k].ch[],x);
if (isin(x,tree[tree[k].ch[]].a)) ins(tree[k].ch[],x);
}
void query(int k,point x)
{
if (!k) return;
if (tree[k].tag) chkmin(ans,dis(x,tree[k].p));
int p=tree[k].ch[],q=tree[k].ch[],u=guess(x,tree[p].a),v=guess(x,tree[q].a);
if (v<u) swap(p,q),swap(u,v);
if (u<ans) query(p,x);
if (v<ans) query(q,x);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj2648.in","r",stdin);
freopen("bzoj2648.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read();
for (int i=;i<=n;i++) a[i].d[]=read(),a[i].d[]=read(),a[i].tag=;
for (int i=;i<=m;i++)
{
q[i].op=read(),q[i].p.d[]=read(),q[i].p.d[]=read();
if (q[i].op==) a[++n]=q[i].p;
}
build(root,,n,);
for (int i=;i<=m;i++)
if (q[i].op==) ins(root,q[i].p);
else ans=inf,query(root,q[i].p),printf("%d\n",ans);
return ;
}
BZOJ2648 SJY摆棋子(KD-Tree)的更多相关文章
- luogu4169 [Violet]天使玩偶/SJY摆棋子 / bzoj2648 SJY摆棋子 k-d tree
k-d tree + 重构的思想,就能卡过luogu和bzoj啦orz #include <algorithm> #include <iostream> #include &l ...
- BZOJ 2648: SJY摆棋子(K-D Tree)
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 6051 Solved: 2113[Submit][Status][Discuss] Descript ...
- BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶
BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...
- [BZOJ2648] SJY摆棋子 kd-tree
2648: SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 5421 Solved: 1910[Submit][Status][Disc ...
- Bzoj2648 SJY摆棋子
Time Limit: 20 Sec Memory Limit: 128 MB Submit: 3128 Solved: 1067 Description 这天,SJY显得无聊.在家自己玩.在一个 ...
- bzoj 2648 SJY摆棋子 kd树
题目链接 初始的时候有一些棋子, 然后给两种操作, 一种是往上面放棋子. 另一种是给出一个棋子的位置, 问你离它最近的棋子的曼哈顿距离是多少. 写了指针版本的kd树, 感觉这个版本很好理解. #inc ...
- 2019.01.14 bzoj2648: SJY摆棋子(kd-tree)
传送门 kd−treekd-treekd−tree模板题. 题意简述:支持在平面上插入一个点,求对于一个点的最近点对. 思路:cdqcdqcdq是一种很不错的分治方法 只是好像码量有点窒息 所以我用了 ...
- 【kd-tree】bzoj2648 SJY摆棋子
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...
- [bzoj2648]SJY摆棋子(带插入kd-tree)
解题关键:带插入kdtree模板题. #include<iostream> #include<cstdio> #include<cstring> #include& ...
随机推荐
- POJ1127 Jack Straws
给你一些线段,求出哪些线段是相连的,哪些是不相连的.相连包括间接相连,即这两条线段本身不直接相连,而是通过其它线段的连接而间接相连. 线段相交+并查集 这里主要说如何判断线段相交:快速排斥试验+跨立试 ...
- PRML5-神经网络(2)
本节来自<pattern recognition and machine learning>第5章. 接(PRML5-神经网络(1)) 5.5NN中的正则化 NN的输入层和输出层的单元个数 ...
- jqgrid 单击行启用行编辑,切换行保存原编辑行
为了加速表格互动编辑,我们往往希望通过选中行就触发了行编辑,完成行编辑后,再选中另一个行做编辑,同时上一个编辑行被自动保存,直至完成需要的编辑内容. 页面效果可能如下: 1)设置需要编辑的列 edit ...
- android学习---Gallery画廊视图
Gallery与Spinner有共同父类:AbsPinner.说明Gallery与Spinner都是一个列表框. 它们之间的差别在于Spinner显示的是一个垂直的列表选择框,而Gallery显示的是 ...
- 笔记:UITextView内容垂直居中方法
- (void)contentSizeToFit { //先判断一下有没有文字(没文字就没必要设置居中了) ) { //textView的contentSize属性 CGSize contentSiz ...
- 大数据入门第十二天——azkaban入门
一.概述 1.azkaban是什么 通过官方文档:https://azkaban.github.io/ Azkaban is a batch workflow job scheduler create ...
- 重新解读DDD领域驱动设计(一)
回顾 十年前,还未踏入某校时,便听闻某学长一毕业就入职北京某公司,月薪过万.对于一个名不见经传的小学院,一毕业能拿到这个薪水还是非常厉害的.听闻他学生期间参与开发了一款股票软件,股票那时正迎来一波疯涨 ...
- 起步 - vue-router路由与页面间导航
vue-router 我们知道路由定义了一系列访问的地址规则,路由引擎根据这些规则匹配找到对应的处理页面,然后将请求转发给页进行处理.可以说所有的后端开发都是这样做的,而前端路由是不存在"请 ...
- Linux/Mac 挂载远程服务器目录到本地
1. 安装 sudo apt-get installsshfs 2. 创建SSHFS 挂载目录 sudo mkdir/mnt/siyuan 3.使用SSHFS 挂载远程的文件系统 sudo sshfs ...
- VS社区版 使用 OpenCover 获取测试代码覆盖率
注:暂不支持VS2017 Visual Studio 2015 社区版没有集成代码覆盖率的功能,所以想在VS社区版中获取单元测试的代码覆盖率等数据,需要使用到插件 OpenCover. 下载 Open ...