【BZOJ】【2648】SJY摆棋子&【BZOJ】【2716】【Violet 3】天使玩偶
KD-Tree
传说中的kd树。。。前去膜拜了一下……写道模板题>_<
写kdtree的一些感想:
插入的时候是像可持久化线段树一样直接在最后开新节点,然后更新它所在的块。。
然而其实也是用原来的叶子再分割一次这块区域?
/**************************************************************
Problem: 2716
User: Tunix
Language: C++
Result: Accepted
Time:16492 ms
Memory:26280 kb
****************************************************************/ //BZOJ 2716
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=,INF=1e9;
/*******************template********************/ struct node{
int d[],mn[],mx[],l,r;
int& operator [] (int x){return d[x];}
void read(){d[]=getint(); d[]=getint();}
}t[N],tmp;
int n,m,D,root,ans,cnt; inline int dis(node a,node b){return abs(a[]-b[])+abs(a[]-b[]);}
bool operator < (node a,node b){return a[D]<b[D] || (a[D]==b[D] && a[!D]<b[!D]);} #define L t[o].l
#define R t[o].r
#define mid (l+r>>1)
void Push_up(int o){
F(i,,){
if (L){ t[o].mn[i]=min(t[o].mn[i],t[L].mn[i]); t[o].mx[i]=max(t[o].mx[i],t[L].mx[i]);}
if (R){ t[o].mn[i]=min(t[o].mn[i],t[R].mn[i]); t[o].mx[i]=max(t[o].mx[i],t[R].mx[i]);}
}
} int build(int l,int r,int dir){
D=dir;
nth_element(t+l,t+mid,t+r+);
F(i,,) t[mid].mn[i]=t[mid].mx[i]=t[mid][i];
if (l<mid) t[mid].l=build(l,mid-,dir^);
if (r>mid) t[mid].r=build(mid+,r,dir^);
Push_up(mid);
return mid;
} inline void Insert(int &o,int dir){
if (!o){
o=++cnt; t[o]=tmp;
F(i,,) t[o].mn[i]=t[o].mx[i]=t[o][i];
return;
}
if (tmp[dir]<t[o][dir]) Insert(L,dir^);
else Insert(R,dir^);
Push_up(o);
} inline int getdis(int o){
if (!o) return INF;
int ans=;
F(i,,) ans+=max(,t[o].mn[i]-tmp[i]);
F(i,,) ans+=max(,tmp[i]-t[o].mx[i]);
return ans;
} inline void query(int o){
int dl=getdis(L),dr=getdis(R),d0=dis(t[o],tmp);
ans=min(ans,d0);
if (dl<dr){
if (dl<ans) query(L);
if (dr<ans) query(R);
}else{
if (dr<ans) query(R);
if (dl<ans) query(L);
}
} int main(){
#ifndef ONLINE_JUDGE
freopen("2716.in","r",stdin);
freopen("2716.out","w",stdout);
#endif
cnt=n=getint(); m=getint();
F(i,,n) t[i].read();
root=build(,n,);
F(i,,m){
int t=getint(); tmp.read();
if (t==) Insert(root,);
else{
ans=INF;
query(root);
printf("%d\n",ans);
}
}
return ;
}
2648: SJY摆棋子
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 1090 Solved: 359
[Submit][Status][Discuss]
Description
天,SJY显得无聊。在家自己玩。在一个棋盘上,有N个黑色棋子。他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距
离这个白色棋子最近的黑色棋子。此处的距离是 曼哈顿距离 即(|x1-x2|+|y1-y2|)
。现在给出N<=500000个初始棋子。和M<=500000个操作。对于每个白色棋子,输出距离这个白色棋子最近的黑色棋子的距离。同一
个格子可能有多个棋子。
Input
Output
Sample Input
1 1
2 3
2 1 2
1 3 3
2 4 2
Sample Output
2
HINT
kdtree可以过
Source
【BZOJ】【2648】SJY摆棋子&【BZOJ】【2716】【Violet 3】天使玩偶的更多相关文章
- bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree
2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec Memory Limit: 128 MB Description 这天,S ...
- BZOJ 2648: SJY摆棋子
2648: SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2968 Solved: 1011[Submit][Status][Disc ...
- BZOJ 2648: SJY摆棋子 kdtree
2648: SJY摆棋子 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2648 Description 这天,SJY显得无聊.在家自己玩 ...
- BZOJ 2648: SJY摆棋子(K-D Tree)
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 6051 Solved: 2113[Submit][Status][Discuss] Descript ...
- bzoj 2648 SJY摆棋子 kd树
题目链接 初始的时候有一些棋子, 然后给两种操作, 一种是往上面放棋子. 另一种是给出一个棋子的位置, 问你离它最近的棋子的曼哈顿距离是多少. 写了指针版本的kd树, 感觉这个版本很好理解. #inc ...
- BZOJ 2648 SJY摆棋子(KD Tree)
http://www.lydsy.com/JudgeOnline/problem.php?id=2648 题意: 思路: KDtree模板题. 参考自http://www.cnblogs.com/ra ...
- BZOJ 2648 SJY摆棋子(KD树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2716 [题目大意] 给出一些点,同时不断插入点和询问某点离插入点最近距离 [题解] 我 ...
- bzoj 2648 SJY摆棋子——KDtree
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2648 第一道KDtree! 学习资料:https://blog.csdn.net/zhl30 ...
- bzoj 2648 SJY摆棋子 —— K-D树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2648 学习资料:https://blog.csdn.net/zhl30041839/arti ...
- BZOJ 2648 SJY摆棋子 ——KD-Tree
[题目分析] KD-Tree第一题,其实大概就是搜索剪枝的思想,在随机数据下可以表现的非常好NlogN,但是特殊数据下会达到N^2. 精髓就在于估价函数get以及按照不同维度顺序划分的思想. [代码] ...
随机推荐
- ThinkPHP之中的事务回滚
小李子 获取thinkphp之中执行的SQL: 1.用调试模式的追踪trace功能: 2.代码: $user_type=D('user_type'); $datass=array('school_id ...
- 搭通自己的电脑与GitHub的传输通道
一.远程仓库怎么玩 1. 自己搭建一个运行Git的服务器 Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上,但肯定有一台机器有着最原始的版本库,然后别的机器来克隆这个原始版本库,这 ...
- leetcode刷题笔记
(1)Best Time to Buy and Sell Stock Total Accepted: 10430 Total Submissions: 33800My Submissions Say ...
- Eclipse之Failed to load the JNI shared library”……\jvm.dll”的解决方案
问题描述:java环境变量配置完全正确,但是运行eclipse时提示:Failed to load the JNI shared library " xxx\jva.dll" 原因 ...
- Bootstrap 2.3.2学习
1.下载架包,下载编译好的文件,文件目录结构如下所示: bootstrap/ ├── css/ │ ├── bootstrap.css │ ├── bootstrap.min.css ├── js/ ...
- 用delphiXE7 dbExpress Framework提供的功能获取数据表信息
uses + Data.DBXMetaDataNames procedure TMainForm.Button2Click(Sender: TObject);var Cmd: TDBXComman ...
- Toast提示信息
用Toast来作为操作成功以及用户误操作等等的提示,非常的简单.直接上代码: 创建方式一: ps: 此处没有设置toast的其他属性,均使用默认的风格(个人觉得默认的风格除了字体比较小之外 还是挺好看 ...
- python 面向对象、特殊方法与多范式、对象的属性及与其他语言的差异
1.python 面向对象 文章内容摘自:http://www.cnblogs.com/vamei/archive/2012/06/02/2532018.html 1.__init__() 创建对 ...
- 菜鸟学习Hibernate——配置Hibernate环境
一.概念. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库.既然学习Hibernate那么第 ...
- 019C#中使用移位运算符获取汉字编码值
在进行移位运算时,当数值的二进制数每次向左移1位就相当于乘以2,当数值每次向右移一位就相当于除以2 private void button1_Click(object sender, EventArg ...