2648: SJY摆棋子

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 5421  Solved: 1910
[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

鸣谢 孙嘉裕

kd-tree裸题

 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<cstdio>
#include<algorithm>
#define maxn 1000001
using namespace std;
struct data {
int mn[],mx[],l,r,d[];
data() {mn[]=mn[]=mx[]=mx[]=l=r=d[]=d[]=;}
}t[maxn*];
int n,m;
int nowd;
bool cmp(data t1,data t2) {return t1.d[nowd]==t2.d[nowd]?t1.d[!nowd]<t2.d[!nowd]:t1.d[nowd]<t2.d[nowd];}
void update(int x) {
if(t[x].l) {
t[x].mx[]=max(t[x].mx[],t[t[x].l].mx[]);
t[x].mn[]=min(t[x].mn[],t[t[x].l].mn[]);
t[x].mx[]=max(t[x].mx[],t[t[x].l].mx[]);
t[x].mn[]=min(t[x].mn[],t[t[x].l].mn[]);
}
if(t[x].r) {
t[x].mx[]=max(t[x].mx[],t[t[x].r].mx[]);
t[x].mn[]=min(t[x].mn[],t[t[x].r].mn[]);
t[x].mx[]=max(t[x].mx[],t[t[x].r].mx[]);
t[x].mn[]=min(t[x].mn[],t[t[x].r].mn[]);
}
}
int build(int l,int r,int D) {
int mid=l+r>>;
nowd=D;
nth_element(t+l+,t+mid+,t+r+,cmp);
if(l!=mid) t[mid].l=build(l,mid-,!D);
if(r!=mid) t[mid].r=build(mid+,r,!D);
t[mid].mx[]=t[mid].mn[]=t[mid].d[];
t[mid].mx[]=t[mid].mn[]=t[mid].d[];
update(mid);
return mid;
}
void insert(int &now,int D,data x) {
if(!now) {now=++n;t[now]=x;t[now].mn[]=t[now].mx[]=x.d[];t[now].mx[]=t[now].mn[]=x.d[];return;}
if(x.d[D]>t[now].d[D]) insert(t[now].r,!D,x);
else insert(t[now].l,!D,x);
update(now);
}
int dis(int now,data x) {
int re=;
if(x.d[]<t[now].mn[]) re+=t[now].mn[]-x.d[];
if(x.d[]>t[now].mx[]) re+=x.d[]-t[now].mx[];
if(x.d[]<t[now].mn[]) re+=t[now].mn[]-x.d[];
if(x.d[]>t[now].mx[]) re+=x.d[]-t[now].mx[];
return re;
}
int ans;
void query(int now,data x) {
ans=min(ans,abs(t[now].d[]-x.d[])+abs(t[now].d[]-x.d[]));
int dl,dr;
if(t[now].l) dl=dis(t[now].l,x); else dl=;
if(t[now].r) dr=dis(t[now].r,x); else dr=;
if(dl<dr) {
if(dl<ans) query(t[now].l,x);
if(dr<ans) query(t[now].r,x);
}
else {
if(dr<ans) query(t[now].r,x);
if(dl<ans) query(t[now].l,x);
}
}
int main() {
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d%d",&t[i].d[],&t[i].d[]);
int mid=build(,n,);
for(int i=;i<=m;i++) {
int tp;data x;
scanf("%d%d%d",&tp,&x.d[],&x.d[]);
if(tp==) insert(mid,,x);
else {ans=;query(mid,x);printf("%d\n",ans);}
}
}

[BZOJ2648] SJY摆棋子 kd-tree的更多相关文章

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

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

  2. BZOJ 2648: SJY摆棋子(K-D Tree)

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 6051  Solved: 2113[Submit][Status][Discuss] Descript ...

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

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

  4. Bzoj2648 SJY摆棋子

    Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 3128  Solved: 1067 Description 这天,SJY显得无聊.在家自己玩.在一个 ...

  5. bzoj 2648 SJY摆棋子 kd树

    题目链接 初始的时候有一些棋子, 然后给两种操作, 一种是往上面放棋子. 另一种是给出一个棋子的位置, 问你离它最近的棋子的曼哈顿距离是多少. 写了指针版本的kd树, 感觉这个版本很好理解. #inc ...

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

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

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

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

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

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

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

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

随机推荐

  1. linux下生成core dump文件方法

    core 文件的简单介绍 当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”).我们可以认为 co ...

  2. 怎么获取textarea中选中文字

    textarea设置select="saveSelectionText()" //保存选中内容 saveSelectionText: function () { var focus ...

  3. 偶遇RandomAccessFile

    一.前言 本来在研究NIO,别人举的栗子里面,看到一个RandomAccessFile类,之前没见过,就去看了一下,现将相关内容记录如下 二.正文 RandomAccessFile直接继承自Objec ...

  4. arcgis的炸开多边形功能

    有时候我们使用dissolve工具,或其他操作会将空间不相连的多边形对应的属性合并到一起,如图: 在高级编辑工具中: 有这样一个工具,但是它能满足我的要求,但是他不是批量的,不过它使用起来比较方便. ...

  5. 【C++ troubleshooting】A case about decltype

    template <typename iter_t> bool next_permutation(iter_t beg, iter_t end) { // if (beg == end | ...

  6. 【题解】APIO2013机器人

    其实这题前前后后的思考时间加起来应该有两天之久了,dp状态,转移方式等等都还是比较好想,然而左看右看觉得spfa复杂度未免太爆炸……然后选择看了一篇题解,发现在多重优化之下,其实是可以过的…… 首先建 ...

  7. [luoguP3644] [APIO2015]八邻旁之桥(权值线段树)

    传送门 首先如果起点终点都在同一侧可以直接处理,如果需要过桥答案再加1 对于k等于1的情况 桥的坐标为x的话,a和b为起点和终点坐标 $ans=\sum_{1}^{n} abs(a_{i}-x)+ab ...

  8. 【bzoj2756 奇怪的游戏】

    Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 4403  Solved: 1226[Submit][Status][Discuss] Descript ...

  9. [COGS 2421] [HZOI 2016] 简单的Treap 笛卡尔树

    笛卡尔树就是你给两维限制,一维堆R,一维二叉搜索树K,平地拔起一棵Treap,最广范的应用:用LCA求区间最值,建Treap,还有个什么范围top k我表示并不会查都查不到.它最妙最高的地方在于用栈来 ...

  10. [NOIP2016]换教室 期望dp

    先弗洛伊德,然后把状态拆分遗传 #include<iostream> #include<cstdio> #include<cstring> #include< ...