[BZOJ2648] SJY摆棋子 kd-tree
2648: SJY摆棋子
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 5421 Solved: 1910
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 1
2 3
2 1 2
1 3 3
2 4 2
Sample Output
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的更多相关文章
- 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摆棋子
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是一种很不错的分治方法 只是好像码量有点窒息 所以我用了 ...
- BZOJ2648 SJY摆棋子(KD-Tree)
板子题. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- 【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& ...
随机推荐
- zufe 蓝桥选拔
https://zufeoj.com/contest.php?cid=1483 问题 A: A 代码: #include <bits/stdc++.h> using namespace s ...
- 前端将markdown转换成html
实现过程: 1. npm引入:npm install marked --save 2.在需要的文件(.ts)里import Marked from "marked"; 如果.j ...
- feof问题
feof()函数是我们C语言中操作文件常见的函数,也是我们最容易出错的函数 这个函数用来表示文件指针是否已经到了文件末尾的下一个位置.这个函数是通用的 可以用在文本文件和二进制文件 (EOF是文件结束 ...
- [C/C++] static在C和C++中的用法和区别
转自:http://blog.csdn.NET/skyereeee/article/details/8000512 static的三个作用: (1)局部静态变量 (2)外部静态变量/函数 (3)静态数 ...
- BZOJ4476 JSOI2015送礼物(分数规划+单调队列)
看到这个式子当然先二分答案.得max-min-(j-i+k)ans>=0. 显然max-min相同的情况下所选区间长度越短越好,所以max和min都应该取在边界.那么实际上我们根本不用管端点是否 ...
- hdu 2527 Safe Or Unsafe (哈夫曼树)
Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- [Leetcode] container with most water 最大水容器
Given n non-negative integers a1 , a2 , ..., an , where each represents a point at coordinate (i, ai ...
- C++——类继承以及类初始化顺序
对于类以及类继承, 几个主要的问题:1) 继承方式: public/protected/private继承. 这是c++搞的, 实际上继承方式是一种允许子类控制的思想. 子类通过public继承, 可 ...
- greendao的基本操作
1.先配置项目的builder.gradle // Top-level build file where you can add configuration options common to all ...
- yaml语法
http://blog.csdn.net/mack415858775/article/details/51015662 name: Tom Smith age: 37 spouse: name: Ja ...