BZOJ2716: [Violet 3]天使玩偶(KD-Tree)
Description
.gif)
Input
.gif)
Output
.gif)
Sample Input
81 23
27 16
52 58
44 24
25 95
34 2
96 25
8 14
97 50
97 18
64 3
47 22
55 28
89 37
75 45
67 22
90 8
65 45
68 93
87 8
61 45
69 72
38 57
58 76
45 34
88 54
27 8
35 34
70 81
25 24
97 97
4 43
39 38
82 68
27 58
2 21
92 88
96 70
97 29
14 53
6 42
1 2
35 84
64 88
63 57
53 40
82 59
49 56
75 72
29 30
50 1
40 83
52 94
22 35
39 1
94 88
89 96
79 46
33 75
31 42
33 95
6 83
90 66
37 54
35 64
17 66
48 37
30 8
95 51
3 51
90 33
29 48
94 78
53 7
1 26
73 35
18 33
99 78
83 59
23 87
4 17
53 91
98 3
54 82
85 92
77 8
56 74
4 5
63 1
26 8
42 15
48 98
27 11
70 98
36 9
78 92
34 40
42 82
64 83
75 47
2 51 55
1 7 62
2 21 62
1 36 39
1 35 89
1 84 15
2 19 24
1 58 53
2 52 34
1 98 49
1 4 100
1 17 25
1 30 56
1 69 43
2 57 23
2 23 13
1 98 25
2 50 27
1 84 63
2 84 81
2 84 77
1 60 23
2 15 27
1 9 51
1 31 11
1 96 56
2 20 85
1 46 32
1 60 88
2 92 48
1 68 5
2 90 17
1 16 46
2 67 5
2 29 83
1 84 70
2 68 27
1 99 33
2 39 89
2 38 28
1 42 3
1 10 60
2 56 29
2 12 60
2 46 51
2 15 73
1 93 42
1 78 82
1 66 20
1 46 17
2 48 5
1 59 61
1 87 59
2 98 72
1 49 3
2 21 10
1 15 4
1 48 14
2 67 75
2 83 77
1 88 65
2 100 93
2 58 83
1 29 80
2 31 88
2 92 94
1 96 66
1 61 82
2 87 24
1 64 83
1 28 87
2 72 90
2 7 3
1 86 3
2 26 53
2 71 2
2 88 24
1 69 60
1 92 44
2 74 94
1 12 78
2 1 2
1 4 73
1 58 5
1 62 14
2 64 58
2 39 45
1 99 27
1 42 21
1 87 2
2 16 98
2 17 21
2 41 20
1 46 72
1 11 62
2 68 29
1 64 66
2 90 42
2 63 35
1 64 71
Sample Output
8
6
7
7
6
6
12
11
4
5
6
8
1
7
6
4
9
2
2
8
9
6
4
7
5
8
7
5
5
5
7
7
5
6
6
8
6
0
2
7
12
4
2
8
3
10
解题思路:
样例好良心。
写CDQ写腻了,这道题还是学一学KD-Tree吧。
KD-Tree,可以认为是在K维空间上二分答案。
将二分得到的顺序建树。
这样的结构很难支持修改,所以暴力插入。
应用替罪羊的想法,不优秀就暴力重建。
时间复杂度玄学。(维护矩形曼哈顿距离)
非常开心地AC
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long lnt;
const int D=;
const int maxn=;
const double alpha=0.75;
int here;
struct KD_pnt{
int v[D];
bool friend operator < (KD_pnt x,KD_pnt y)
{
return x.v[here]<y.v[here];
}
}p[maxn];
struct KD_trnt{
KD_pnt val;
KD_pnt mx;
KD_pnt mn;
int ls;
int rs;
int wgt;
}kt[maxn],stdkt;
int n,m;
int ans;
int top;
int siz;
int root;
int bin[maxn];
inline int read(void)
{
int anss=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-')
f=-f;
ch=getchar();
}
while(ch>=''&&ch<='')
{
anss=anss*+ch-'';
ch=getchar();
}
return anss*f;
}
int newp(void)
{
if(top)
return bin[top--];
return ++siz;
}
void Trash(int spc)
{
bin[++top]=spc;
return ;
}
void apply(int &spc)
{
spc=newp();
kt[spc]=stdkt;
return ;
}
int Dist(KD_pnt a,KD_pnt b)
{
int ans=;
for(int i=;i<D;i++)
ans+=std::abs(a.v[i]-b.v[i]);
return ans;
}
int assess(KD_pnt a,int spc)
{
int ans=;
for(int i=;i<D;i++)
ans+=std::max(,a.v[i]-kt[spc].mx.v[i])+std::max(,kt[spc].mn.v[i]-a.v[i]);
return ans;
}
void pushup(int spc)
{
kt[spc].mx=kt[spc].mn=kt[spc].val;
if(kt[spc].ls)
{
kt[spc].mx.v[]=std::max(kt[spc].mx.v[],kt[kt[spc].ls].mx.v[]);
kt[spc].mn.v[]=std::min(kt[spc].mn.v[],kt[kt[spc].ls].mn.v[]);
kt[spc].mx.v[]=std::max(kt[spc].mx.v[],kt[kt[spc].ls].mx.v[]);
kt[spc].mn.v[]=std::min(kt[spc].mn.v[],kt[kt[spc].ls].mn.v[]);
}
if(kt[spc].rs)
{
kt[spc].mx.v[]=std::max(kt[spc].mx.v[],kt[kt[spc].rs].mx.v[]);
kt[spc].mn.v[]=std::min(kt[spc].mn.v[],kt[kt[spc].rs].mn.v[]);
kt[spc].mx.v[]=std::max(kt[spc].mx.v[],kt[kt[spc].rs].mx.v[]);
kt[spc].mn.v[]=std::min(kt[spc].mn.v[],kt[kt[spc].rs].mn.v[]);
}
kt[spc].wgt=+kt[kt[spc].ls].wgt+kt[kt[spc].rs].wgt;
return ;
}
void build(int l,int r,int dim,int &spc)
{
if(l>r)
{
spc=;
return ;
}
apply(spc);
here=dim;
int mid=(l+r)>>;
std::nth_element(p+l,p+mid,p+r+);
kt[spc].val=p[mid];
build(l,mid-,dim^,kt[spc].ls);
build(mid+,r,dim^,kt[spc].rs);
pushup(spc);
return ;
}
void Destory(int spc,int sta)
{
if(kt[spc].ls)
Destory(kt[spc].ls,sta);
p[sta+kt[kt[spc].ls].wgt+]=kt[spc].val;
Trash(spc);
if(kt[spc].rs)
Destory(kt[spc].rs,sta+kt[kt[spc].ls].wgt+);
return ;
}
bool imbalance(int root)
{
return ((double)(std::max(kt[kt[root].ls].wgt,kt[kt[root].rs].wgt))>alpha*(double)(kt[root].wgt));
}
void rebuild(int &spc,int dim)
{
Destory(spc,);
build(,kt[spc].wgt,dim,spc);
return ;
}
void Insert(int &spc,KD_pnt x,int dim)
{
if(!spc)
{
apply(spc);
kt[spc].val=x;
pushup(spc);
return ;
}
if(kt[spc].val.v[dim]<x.v[dim])
Insert(kt[spc].rs,x,dim^);
else
Insert(kt[spc].ls,x,dim^);
pushup(spc);
if(imbalance(spc))
rebuild(spc,dim);
return ;
}
void Query(int spc,KD_pnt x)
{
if(!spc)
return ;
ans=std::min(ans,Dist(x,kt[spc].val));
int disls,disrs;
if(kt[spc].ls)
disls=assess(x,kt[spc].ls);
else
disls=0x7f7f7f7f;
if(kt[spc].rs)
disrs=assess(x,kt[spc].rs);
else
disrs=0x7f7f7f7f;
if(disls<disrs)
{
if(disls<ans)
Query(kt[spc].ls,x);
if(disrs<ans)
Query(kt[spc].rs,x);
}else{
if(disrs<ans)
Query(kt[spc].rs,x);
if(disls<ans)
Query(kt[spc].ls,x);
}
return ;
}
int main()
{
n=read();
m=read();
for(int i=;i<=n;i++)
p[i].v[]=read(),p[i].v[]=read();;
build(,n,,root);
while(m--)
{
int cmd;
KD_pnt x;
ans=0x7f7f7f7f;
cmd=read();
x.v[]=read();
x.v[]=read();
if(cmd==)
Insert(root,x,);
else{
Query(root,x);
printf("%d\n",ans);
}
}
return ;
}
BZOJ2716: [Violet 3]天使玩偶(KD-Tree)的更多相关文章
- bzoj2648SJY摆棋子&&bzoj2716[Violet 3]天使玩偶*
bzoj2648SJY摆棋子 bzoj2716[Violet 3]天使玩偶 题意: 棋盘上有n个棋子,现在有m个操作,一种是加棋子,一种是查询离某个点最近的棋子.n,m≤500000. 题解: 先将已 ...
- [BZOJ2716] [Violet 3]天使玩偶(CDQ分治)
[BZOJ2716] [Violet 3]天使玩偶(CDQ分治) 题面 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里, ...
- 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree
2648: SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2459 Solved: 834[Submit][Status][Discu ...
- BZOJ2648/2716:SJY摆棋子/[Violet]天使玩偶(K-D Tree)
Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子. ...
- bzoj2716: [Violet 3]天使玩偶
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- 【kd-tree】bzoj2716 [Violet 3]天使玩偶
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...
- BZOJ.2716.[Violet3]天使玩偶(K-D Tree)
题目链接 KD-Tree.因为插入过多点后可能会退化成链,所以左/右子树sz > α*整棵子树sz时对整棵子树进行重构. 树的节点数必须是3n?why?洛谷,BZOJ都这样..(数据范围错了吧 ...
- BZOJ2716 [Violet 3]天使玩偶 【CDQ分治】
题目 输入格式 输出格式 输入样例 //样例太长就不贴了.... 输出样例 //见原题 提示 题解 我们将曼哈顿距离式子中的绝对值去掉,每次只考虑x,y比当前点小的更新答案. 为了使所有点都对答案进行 ...
- BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶
BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...
随机推荐
- win32下实现透明窗体
最開始写透明窗体的代码,在百度了之后,找到了SetLayeredWindowAttributes()这一个函数,可是因为网上案列的缺少,使得非常多人无法非常好的使用这一个方法,我花了几天的时间写了一个 ...
- (2) 我的结果- spec2006中精确的simulation points运行点
spec06中获取simpoints的环境说明: spec的版本号为spec2006v1.0; 使用ref input with runspec; 100millions为周期生成的simpoints ...
- 数据格式转换 (三)Office文档转HTML
HTML Filter 是由北京红樱枫软件有限公司根据HTML Ver 4.01/CSS式样,研制和开发的MS Office系列文档到HTML转换的通用程序库.便于用户实现对多种文档的统一管 ...
- STL_算法_局部排序(partial_sort、partial_sort_copy)
C++ Primer 学习中. . . 简单记录下我的学习过程 (代码为主) /***************************************** // partial_sort(b, ...
- OpenCV【2】---读取png图片显示到QT label上的问题
问题一: 操作图片test.png是一个365x365的PNG图片 通过OpenCV自带的GUI显示出来图像是没问题的,例如以下操作代码所看到的: QStringfileName=QFileD ...
- Intellij Idea创建的第一个JavaWeb程序
第一个JavaWeb程序 1. 创建 2. 目录结构 src目录用于放java源文件,web目录用于放web资源,WEB-INF是Java web应用固定的存放配置及类库的目录,index.jsp是我 ...
- 关于Javascript的forEach 和 map
本篇博客转载自 https://blog.fundebug.com/2018/02/05/map_vs_foreach/ 如果你已经有使用JavaScript的经验,你可能已经知道这两个看似相同的方法 ...
- BZOJ 1305 二分+网络流
思路: 建图我根本没有想到啊--. (我是不会告诉你我借鉴了一下题解的思路) 把每个人拆成喜欢的和不喜欢的点 男 喜欢 向 男 不喜欢 连 边权为k的边 如果男喜欢女 那么 男喜欢向 女喜欢 连 1 ...
- spring之DelegatingFilterProxy
DelegatingFilterProxy是一个标准servlet Filter的代理,代理实现了Filter接口的spring管理的Bean.支持一个在web.xml的init-param定义的&q ...
- Ubuntu下通过Firefox Opera Chromium浏览器直接执行java应用程序(打开java jnlp文件)实现在服务器远程虚拟控制台完成远程管理的方法
远程虚拟控制台依赖于java运行环境(jre),在通过浏览器打开链接前,系统必须安装jre环境,远程管理控制台其实就是一个java程序,打开相应的网站会下载一个jnlp(java网络加载协议)的文件, ...