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& ...
随机推荐
- zabbix items 配置
item是什么?它是我们对于host监控的基本条目,它属于不同的applications中,item的设置既可以针对具体的某个host主机,也可以针对模板进行设定(可以在多个主机进行复用). item ...
- STM32 中 BIT_BAND(位段/位带)和别名区使用入门(转载)
一. 什么是位段和别名区 是这样的,记得MCS51吗? MCS51就是有位操作,以一位(BIT)为数据对象的操作,MCS51可以简单的将P1口的第2位独立操作: P1.2=0;P1.2=1 :这样就把 ...
- day75
昨日回顾: 1 inclusion_tag -干什么用的?生成html的片段(动态,传参数,传数据) -app下新建一个模块,templatetags -创建一个py文件(mytag.p ...
- Php的常见错误及错误分析
我们在进行开发工作的时候,难免会遇到PHP的报错,解决这些错误,也是作为PHPer必须掌握的一种技能. 如果程序发生错误,我们能大致的分析出出现错误的原因,对于我们解决这戏错误会有很大的帮助. Not ...
- spark-windows(含eclipse配置)下本地开发环境搭建
spark-windows(含eclipse配置)下本地开发环境搭建 >>>>>>注意:这里忽略JDK的安装,JDK要求是1.8及以上版本,请通过 java ...
- 复选框、单选框 jquery判断是否选中Demo
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="eachcheckbox.a ...
- 基于RapidJSON的操作库
需要安装配置RapidJSON库 /******************************************************************* * summery: 提供便 ...
- Qt FFMPEG+OpenCV开启摄像头
//ffmpegDecode.h #ifndef __FFMPEG_DECODE_H__ #define __FFMPEG_DECODE_H__ #include "global.h&quo ...
- C语言和python的区别
Python可以说是目前最火的语言之一了,人工智能的兴起让Python一夜之间变得家喻户晓,Python号称目前最最简单易学的语言,现在有不少高校开始将Python作为大一新生的入门语言.本萌新也刚开 ...
- stl源码剖析 详细学习笔记heap
// // heap.cpp // 笔记 // // Created by fam on 15/3/15. // // //---------------------------15/03/15 ...