板子题。

#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<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
int n,m,root,cnt,c,ans;
struct point
{int d[2],tag;bool operator <(const point&a) const{return d[c]<a.d[c];}
}a[N];
struct KDTree{int ch[2],a[2][2],tag;point p;
}tree[N];
struct data{int op;point p;
}q[N];
inline int dis(point u,point v){return abs(u.d[0]-v.d[0])+abs(u.d[1]-v.d[1]);}
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[2][2]){return a[0][0]<=x.d[0]&&a[0][1]>=x.d[0]&&a[1][0]<=x.d[1]&&a[1][1]>=x.d[1];}
inline int max(int x,int y,int z){return max(max(x,y),z);}
inline int guess(point x,int a[2][2]){return max(0,a[0][0]-x.d[0],x.d[0]-a[0][1])+max(0,a[1][0]-x.d[1],x.d[1]-a[1][1]);}
void build(int &k,int l,int r,int op)
{if (l>r) return;k=++cnt;c=op;int mid=l+r>>1;nth_element(a+l,a+mid,a+r+1);tree[k].p=a[mid],tree[k].tag=a[mid].tag,tree[k].a[0][0]=tree[k].a[0][1]=a[mid].d[0],tree[k].a[1][0]=tree[k].a[1][1]=a[mid].d[1];for (int i=l;i<=r;i++)chkmin(tree[k].a[0][0],a[i].d[0]),chkmax(tree[k].a[0][1],a[i].d[0]),chkmin(tree[k].a[1][0],a[i].d[1]),chkmax(tree[k].a[1][1],a[i].d[1]);build(tree[k].ch[0],l,mid-1,op^1);build(tree[k].ch[1],mid+1,r,op^1);
}
void ins(int k,point x)
{if (!k) return;if (tree[k].p.d[0]==x.d[0]&&tree[k].p.d[1]==x.d[1]) {tree[k].tag=1;return;}if (isin(x,tree[tree[k].ch[0]].a)) ins(tree[k].ch[0],x);if (isin(x,tree[tree[k].ch[1]].a)) ins(tree[k].ch[1],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[0],q=tree[k].ch[1],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_JUDGEfreopen("bzoj2648.in","r",stdin);freopen("bzoj2648.out","w",stdout);const char LL[]="%I64d\n";
#elseconst char LL[]="%lld\n";
#endifn=read(),m=read();for (int i=1;i<=n;i++) a[i].d[0]=read(),a[i].d[1]=read(),a[i].tag=1;for (int i=1;i<=m;i++){q[i].op=read(),q[i].p.d[0]=read(),q[i].p.d[1]=read();if (q[i].op==1) a[++n]=q[i].p;}build(root,1,n,0);for (int i=1;i<=m;i++)if (q[i].op==1) ins(root,q[i].p);else ans=inf,query(root,q[i].p),printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/Gloid/p/10159247.html

BZOJ2648 SJY摆棋子(KD-Tree)相关推荐

  1. BZOJ2648: SJY摆棋子2716: [Violet 3]天使玩偶

    BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...

  2. BZOJ2648: SJY摆棋子

    Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子. ...

  3. [bzoj2648]SJY摆棋子(带插入kd-tree)

    解题关键:带插入kdtree模板题. #include<iostream> #include<cstdio> #include<cstring> #include& ...

  4. 天使玩偶/SJY摆棋子

    P4169 [Violet]天使玩偶/SJY摆棋子 CDQ分治的题目. 我们发现题目要我们求的\(|A_x-B_x|+|A_y-B_y|\)的绝对值号比较恶心. 试想一下怎么去掉 如果所有的点都在我们 ...

  5. BZOJ 2648 SJY摆棋子(KD-Tree)

    题目链接:BZOJ 2648  SJY摆棋子 题意: 在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子.此处 ...

  6. bzoj 2648: SJY摆棋子2716: [Violet 3]天使玩偶 --kdtree

    2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec  Memory Limit: 128 MB Description 这天,S ...

  7. [Luogu4169] [Violet]天使玩偶/SJY摆棋子 [cdq分治/k-d tree]

    [Link\frak{Link}Link] 考虑用 cdq 分治解决? 显然依旧分成修改跟查询,考虑一维排序二维cdq?啊但是那显然不太对,cdq能解决三维偏序, 但是她不能解决最近点对啊.平面最近点 ...

  8. 【bzoj2648】SJY摆棋子 KD-tree

    题目描述 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子.此处的距离是 ...

  9. 2716: [Violet 3]天使玩偶/2648: SJY摆棋子

    题目链接 题目大意:平面动态加点,求与给出的点曼哈顿距离最近点 题解:KD树模板题 我的收获:23333 #include <cstdio> #include <iostream&g ...

最新文章

  1. 【bzoj1070】[SCOI2007]修车 最小费用流
  2. 美国半导体十年计划中的NO.1,模拟硬件究竟有什么价值?
  3. 【Groovy】编译时元编程 ( 编译时方法拦截 | 在 MyASTTransformation#visit 方法中进行方法拦截 )
  4. 程序员面试题精选100题(10)-排序数组中和为给定值的两个数字[算法]
  5. C++实现二叉搜索树的查找(附完整源码)
  6. SharpDevelop--一款很不错的.NET开发工具
  7. 二级c语言不写编程,计算机二级C语言 到底是不是考原题
  8. dreamweaver cc php mysql_Dreamweaver cc 2015 +PHP+MySQL动态网站开发案例教程集合
  9. Processing绘制星空-2-绘制流星
  10. python读取odb_python - 从.odb文件中提取von mises应力值 - 堆栈内存溢出
  11. 快排(基础详解入门)
  12. 计算机界面无法全部显示,电脑屏幕不能完整显示软件界面怎么处理
  13. ParticleDesigner 粒子编辑器使用
  14. 计算机术语 日语,常用日语计算机词汇~~
  15. 智能摄像头在我们的家居生活中,主要包含哪些利弊?
  16. URLLC关键技术和网络适应性分析
  17. 通过QQ互联实现网站第三方登录
  18. 一个域名如何解析到多个ip地址
  19. 【姿态检测】win10+Azure Kinect Dk 人体姿态跟踪使用教程
  20. 告别苹果,英特尔明天会更好

热门文章

  1. Cloud for Customer custom BO创建时间随着行项目数量增加而增加的关系
  2. Authentication和Authorization的区别
  3. 在计算机应用领域 cad的指,在计算机应用领域,CAD的指的是____
  4. python链接mysql系统结构设计_MySQLpython交互
  5. 《非暴力沟通》听书心得
  6. 单元测试 代码里面都绝对路径怎么处理_原创 | 编写单元测试和实践TDD (六)测试哪些内容:Right-BICEP...
  7. Python中float(‘inf‘)代表什么意思?
  8. matlab xlsread参数_利用MATLAB批量完成科研数据处理
  9. Hadoop集群环境搭建之伪分布式搭建流程
  10. 中原工学院c语言期末考试题,中原工学院软件学院 2010年C语言 试卷A