SJY摆棋子

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 5199  Solved: 1813
[Submit][Status][Discuss]

Description

这天,SJY显得无聊。在家自己玩。在一个棋盘上,有N个黑色棋子。他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子。此处的距离是 曼哈顿距离 即(|x1-x2|+|y1-y2|) 。现在给出N<=500000个初始棋子。和M<=500000个操作。对于每个白色棋子,输出距离这个白色棋子最近的黑色棋子的距离。同一个格子可能有多个棋子。

Input

第一行两个数 N M
以后M行,每行3个数 t x y
如果t=1 那么放下一个黑色棋子
如果t=2 那么放下一个白色棋子

Output

对于每个T=2 输出一个最小距离

Sample Input

2 3
1 1
2 3
2 1 2
1 3 3
2 4 2

Sample Output


1
2

HINT

kdtree可以过

Source

鸣谢 孙嘉裕

题解:kdtree的应用,查询最近的距离,就是缩小范围,和最优性剪枝即可过了。
  1 #include<cstring>
  2 #include<cmath>
  3 #include<iostream>
  4 #include<algorithm>
  5 #include<cstdio>
  6
  7 #define inf 1000000007
  8 #define N 500007
  9 #define ll long long
 10 using namespace std;
 11 inline int read()
 12 {
 13     int x=0,f=1;char ch=getchar();
 14     while(ch<'0'||ch>'9'){if (ch=='-')f=-1;ch=getchar();}
 15     while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
 16     return x*f;
 17 }
 18
 19 int n,m,rt,F;
 20 struct Node
 21 {
 22     int d[2],mn[2],mx[2],l,r;
 23     int& operator[](int x)
 24     {
 25         return d[x];
 26     }
 27     Node(int x=0,int y=0)//无代入的话x,y为0,代入即为代入值。
 28     {
 29         l=0,r=0;
 30         d[0]=x,d[1]=y;
 31     }
 32 }p[N];
 33 bool operator<(Node x,Node y)
 34 {
 35     return x[F]<y[F];
 36 }
 37 inline int dis(Node x,Node y)
 38 {
 39     return abs(x[0]-y[0])+abs(x[1]-y[1]);
 40 }
 41 struct kdtree
 42 {
 43     int ans;
 44     Node tr[N*2],T;
 45     void update(int p)
 46     {
 47         Node l=tr[tr[p].l],r=tr[tr[p].r];
 48         for (int i=0;i<2;i++)
 49         {
 50             if (tr[p].l)tr[p].mn[i]=min(tr[p].mn[i],l.mn[i]),tr[p].mx[i]=max(tr[p].mx[i],l.mx[i]);
 51             if (tr[p].r)tr[p].mn[i]=min(tr[p].mn[i],r.mn[i]),tr[p].mx[i]=max(tr[p].mx[i],r.mx[i]);
 52         }
 53     }
 54     int build(int l,int r,int now)
 55     {
 56         F=now;int mid=(l+r)>>1;
 57         nth_element(p+l,p+mid,p+r+1);
 58         tr[mid]=p[mid];
 59         for (int i=0;i<2;i++)
 60             tr[mid].mn[i]=tr[mid].mx[i]=tr[mid][i];
 61         if (l<mid)tr[mid].l=build(l,mid-1,now^1);
 62         if (r>mid)tr[mid].r=build(mid+1,r,now^1);
 63         update(mid);
 64         return mid;
 65     }
 66     void ins(int p,int now)
 67     {
 68         if (T[now]>=tr[p][now])
 69         {
 70             if(tr[p].r)ins(tr[p].r,now^1);
 71             else
 72             {
 73                 tr[p].r=++n,tr[n]=T;
 74                 for (int i=0;i<2;i++)
 75                     tr[n].mn[i]=tr[n].mx[i]=tr[n][i];
 76             }
 77         }
 78         else
 79         {
 80             if (tr[p].l)ins(tr[p].l,now^1);
 81             else
 82             {
 83                 tr[p].l=++n,tr[n]=T;
 84                 for (int i=0;i<2;i++)
 85                     tr[n].mn[i]=tr[n].mx[i]=tr[n][i];
 86             }
 87         }
 88         update(p);
 89     }
 90     int get(int k,Node p)
 91     {
 92         int tmp=0;
 93         for (int i=0;i<2;i++)
 94             tmp+=max(0,tr[k].mn[i]-p[i]);
 95         for (int i=0;i<=2;i++)
 96              tmp+=max(0,p[i]-tr[k].mx[i]);
 97         return tmp;
 98     }
 99     void query(int p,int now)
100     {
101         int d,dl=inf,dr=inf;
102         d=dis(tr[p],T);
103         ans=min(ans,d);
104         if (tr[p].l)dl=get(tr[p].l,T);
105         if (tr[p].r)dr=get(tr[p].r,T);
106         if (dl<dr)
107         {
108             if (dl<ans)query(tr[p].l,now^1);
109             if (dr<ans)query(tr[p].r,now^1);
110         }
111         else
112         {
113             if (dr<ans)query(tr[p].r,now^1);
114             if (dl<ans)query(tr[p].l,now^1);
115         }
116     }
117     int query(Node p)
118     {
119         ans=inf,T=p,query(rt,0);
120         return ans;
121     }
122     void ins(Node p)
123     {
124         T=p;
125         ins(rt,0);
126     }
127 }kd;
128 int main()
129 {
130     freopen("fzy.in","r",stdin);
131     freopen("fzy.out","w",stdout);
132
133     n=read(),m=read();
134     for (int i=1;i<=n;i++)
135         p[i][0]=read(),p[i][1]=read();
136     rt=kd.build(1,n,0);//后者0,代表维的循环
137     while(m--)
138     {
139         int flag=read(),x=read(),y=read();
140         if (flag==1) kd.ins(Node(x,y));
141         else printf("%d\n",kd.query(Node(x,y)));
142     }
143 }

转载于:https://www.cnblogs.com/fengzhiyuan/p/8176561.html

bzoj2648/2716 kdtree相关推荐

  1. BZOJ2648 SJY摆棋子(KD-Tree)

    板子题. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...

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

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

  3. KD-Tree复习笔记(BZOJ1941 BZOJ2648 BZOJ4066)

    快一年了都没碰到什么必须用KDT的题目导致模板完全忘光了,重新复习了一下. K_Dimention_Tree是一种用来处理二维以上问题的数据结构(OI中一般都是二维),本质是二维启发式估价函数实现剪枝 ...

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

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

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

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

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

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

  7. [KDTree] [BZOJ2716] [Violet 3] 天使玩偶

    题目描述 Description Ayu在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后的今天,Ayu却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们 ...

  8. BZOJ 2716 Violet 3 天使玩偶

    2716: [Violet 3]天使玩偶 Time Limit: 80 Sec  Memory Limit: 128 MB Submit: 2145  Solved: 928 [Submit][Sta ...

  9. 【BZOJ 2716/2648】 [Violet 3]天使玩偶

    2716: [Violet 3]天使玩偶 kd-tree模板题. ①首先依次按照每一维(即先按照 x x,再按照yy,再按照 x x-多维同理)将点存在一棵二叉树中: 先求出以当前维数为关键字的中间点 ...

  10. Open3D KdTree建立、3种近邻搜索及结果可视化

    1. 点云索引 Open3D KdTree,可以快速的在无序的点云中建立空间拓扑结构,使得能迅速的进行近邻搜索: 2. 近邻方法分类: Open3D这边支持的近邻搜索方法由VTK实现: K近邻搜索(K ...

最新文章

  1. Kettle使用_9 存储过程与设置变量
  2. Docker容器基本使用
  3. 2021年中国手机游戏行业研究报告
  4. 《俄罗斯方块》正版授权手游开启预约:支持QQ、微信双平台
  5. Spring学习之AOP
  6. Active Learning through label error statistical methods(ALSE)
  7. 【先锋】永洪科技何春涛:不忘初心,砥砺前行
  8. 计算机重装系统知识,想学重装系统要怎么做?重难点知识讲解,零基础照样能够装系统!...
  9. [AV1] AV1 帧内预测
  10. kiosk 无效_开发Kiosk Web应用程序的10个技巧
  11. 服务器UDIMM, LRDIMM,RDIMM三种内存的区别
  12. TuscanySCA5-理解SCA Domian
  13. 微信小程序开发者问题集锦
  14. 基于Simulink的高速跳频通信系统抗干扰性能
  15. markdown左对齐
  16. 手搭深度推荐模型(四) NFM
  17. Google Perftools简介与使用
  18. gitlab编译安装史----虽败犹荣
  19. mysql 事务隔离界别_MySQL数据库事务隔离级别(Transaction Isolation Level)
  20. Echarts图表效果图(Make A Pie替代)

热门文章

  1. [bzoj 1030][JSOI2007]文本生成器
  2. bottle框架学习(四)之模版进阶使用
  3. 2010.6.20 OA项目组一周工作报告
  4. Windows Server 2008 计划任务配置(任务计划程序)每分钟执行BAT
  5. idm下载百度网盘有限制 提示403错误 下载显示没有权限404,最新的解决办法教程
  6. android support-v4、v7、v13
  7. ImageView的属性android:scaleType作用
  8. 一款非常牛逼的 Java 爬虫框架!(请低调使用)
  9. GitHub又出新功能了,网友:这也太爽了吧。。。
  10. 并发减库存,怎么保证不超卖?