Time Limit: 20 Sec  Memory Limit: 128 MB

Submit: 3128  Solved: 1067

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

K-Dtree模板题

似乎有种懂了的错觉

(錯覚?それでは、聞いてください....)

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int INF=1e9;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*-''+ch;ch=getchar();}
return x*f;
}
int nowD;
struct node{
int min[],max[];
int d[];
int l,r;
}t[mxn<<];
int root,nct=;
int cmp(const node a,const node b){
if(a.d[nowD]==b.d[nowD])return a.d[nowD^]<b.d[nowD^];
return a.d[nowD]<b.d[nowD];
}
int qx,qy;//查询参数
void pushup(int rt,int c){//更新结点信息
t[rt].max[]=max(t[rt].max[],t[c].max[]);
t[rt].min[]=min(t[rt].min[],t[c].min[]);
t[rt].max[]=max(t[rt].max[],t[c].max[]);
t[rt].min[]=min(t[rt].min[],t[c].min[]);
return;
}
int Build(int l,int r,int D){
nowD=D;int mid=(l+r)>>;
nth_element(t+l,t+mid,t+r+,cmp);
t[mid].max[]=t[mid].min[]=t[mid].d[];
t[mid].max[]=t[mid].min[]=t[mid].d[];
if(l!=mid) t[mid].l=Build(l,mid-,D^);
if(r!=mid) t[mid].r=Build(mid+,r,D^);
if(t[mid].l)pushup(mid,t[mid].l);
if(t[mid].r)pushup(mid,t[mid].r);
return mid;
}
void insert(int x){//插入新结点
int now=root,D=;
while(){
pushup(now,x);
if(t[x].d[D]>=t[now].d[D]){
if(!t[now].r){t[now].r=x;return;}
else now=t[now].r;
}
else{
if(!t[now].l){t[now].l=x;return;}
else now=t[now].l;
}
D^=;
}
return;
}
int Dist(int k){//估价
int res=;
if(qx<t[k].min[])res+=t[k].min[]-qx;
if(qx>t[k].max[])res+=qx-t[k].max[];
if(qy<t[k].min[])res+=t[k].min[]-qy;
if(qy>t[k].max[])res+=qy-t[k].max[];
return res;
}
int ans;
void query(int rt){
int dx,dy,tmp;
// printf("rt:%d pos:%d %d ans:%d\n",rt,t[rt].d[0],t[rt].d[1],ans);
tmp=abs(t[rt].d[]-qx)+abs(t[rt].d[]-qy);
if(tmp<ans)ans=tmp;
if(t[rt].l) dx=Dist(t[rt].l);else dx=INF;
if(t[rt].r) dy=Dist(t[rt].r);else dy=INF;
if(dx<dy){
if(dx<ans) query(t[rt].l);
if(dy<ans) query(t[rt].r);
}
else{
if(dy<ans) query(t[rt].r);
if(dx<ans) query(t[rt].l);
}
return;
}
int n,m;
int main(){
int i,j;
n=read();m=read();
int T,x,y;
for(i=;i<=n;i++){
t[++nct].d[]=read();
t[nct].d[]=read();
}
root=Build(,n,);
while(m--){
T=read();x=read();y=read();
if(T==){
t[++nct].d[]=x; t[nct].d[]=y;
t[nct].max[]=t[nct].min[]=t[nct].d[];
t[nct].max[]=t[nct].min[]=t[nct].d[];
insert(nct);
}
else{
qx=x;qy=y;ans=INF;
query(root);
printf("%d\n",ans);
}
}
return ;
}

Bzoj2648 SJY摆棋子的更多相关文章

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

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

  2. [BZOJ2648] SJY摆棋子 kd-tree

    2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 5421  Solved: 1910[Submit][Status][Disc ...

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

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

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

    #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...

  5. 2019.01.14 bzoj2648: SJY摆棋子(kd-tree)

    传送门 kd−treekd-treekd−tree模板题. 题意简述:支持在平面上插入一个点,求对于一个点的最近点对. 思路:cdqcdqcdq是一种很不错的分治方法 只是好像码量有点窒息 所以我用了 ...

  6. KDTree(Bzoj2648: SJY摆棋子)

    题面 传送门 KDTree 大概就是一个分割\(k\)维空间的数据结构,二叉树 建立:每层选取一维为关键字,把中间的点拿出来,递归左右,有个\(STL\)函数nth_element可以用一下 维护:维 ...

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

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

  8. luogu4169 [Violet]天使玩偶/SJY摆棋子 / bzoj2648 SJY摆棋子 k-d tree

    k-d tree + 重构的思想,就能卡过luogu和bzoj啦orz #include <algorithm> #include <iostream> #include &l ...

  9. 【BZOJ2648】SJY摆棋子(KD-Tree)

    [BZOJ2648]SJY摆棋子(KD-Tree) 题面 BZOJ Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一 ...

随机推荐

  1. iOS APNS配置(转)

    Introduction To send Push notification to an application/device couple you need an unique device tok ...

  2. Stream 和 byte[]

    C# Stream 和 byte[] 之间的转换   一. 二进制转换成图片MemoryStream ms = new MemoryStream(bytes);ms.Position = 0;Imag ...

  3. 安卓开发:效果图中标注的像素尺寸如何转换为安卓的dp尺寸?

    我们的UI基于1920x1080分辨率给的尺寸标注,但是在安卓开发中大家一般都使用dp.sp来标注界面尺寸,所以需要一个dp与sp的转换公式. 一开始参考的的这篇文章:关于Android开发中px.d ...

  4. UWP 快速的Master/Detail实现

    最近在写快报(还没有写完)的过程中,一开始就遇到了这个Master/Detail如何实现的问题. 微软给出Demo并不符合要求,搜索后找到了今日头条开发者写的一篇 :实现Master/Detail布局 ...

  5. 20160205 - Windows 10 家庭版没有组策略

    问题描述:买笔电自带的正版系统,有一个需要使用gpedit.msc,发现并不存在. 解决办法:升级到 Windows 10 专业版

  6. XML是什么东西

    记住,XML就是为数据传输而设计的一种标记语言,也是特么的一种标记语言,在这点上,和html是有点类似的,你看<xml>和<html>看上去难道不是很像嘛,而html是为数据显 ...

  7. Go语言interface详解

    interface Go语言里面设计最精妙的应该算interface,它让面向对象,内容组织实现非常的方便,当你看完这一章,你就会被interface的巧妙设计所折服. 什么是interface 简单 ...

  8. 深入 理解vxlan

    VXLAN RFC 文档 : https://tools.ietf.org/html/rfc7348 作为网络虚拟化的重要技术,VXLAN备受关注,该协议是如何运作的?如何通过数据与控制层面的分离实现 ...

  9. viewSub惰性装载器

    在需要的时候才解析,不耗费资源 <ViewStub android:id="@+id/stub" android:layout_width="wrap_conten ...

  10. Java的反射机制(Reflection)

    反射机制 指可以在运动时加载.探知.使用编译期间完全未知的类 程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够获取这个类的属性和方法:对于任意一个对象可以调用它的任意一个 ...