Description

Input

Output

Sample Input

100 100
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

3
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)的更多相关文章

  1. bzoj2648SJY摆棋子&&bzoj2716[Violet 3]天使玩偶*

    bzoj2648SJY摆棋子 bzoj2716[Violet 3]天使玩偶 题意: 棋盘上有n个棋子,现在有m个操作,一种是加棋子,一种是查询离某个点最近的棋子.n,m≤500000. 题解: 先将已 ...

  2. [BZOJ2716] [Violet 3]天使玩偶(CDQ分治)

    [BZOJ2716] [Violet 3]天使玩偶(CDQ分治) 题面 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里, ...

  3. 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree

    2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2459  Solved: 834[Submit][Status][Discu ...

  4. BZOJ2648/2716:SJY摆棋子/[Violet]天使玩偶(K-D Tree)

    Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子. ...

  5. bzoj2716: [Violet 3]天使玩偶

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  6. 【kd-tree】bzoj2716 [Violet 3]天使玩偶

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

  7. BZOJ.2716.[Violet3]天使玩偶(K-D Tree)

    题目链接 KD-Tree.因为插入过多点后可能会退化成链,所以左/右子树sz > α*整棵子树sz时对整棵子树进行重构. 树的节点数必须是3n?why?洛谷,BZOJ都这样..(数据范围错了吧 ...

  8. BZOJ2716 [Violet 3]天使玩偶 【CDQ分治】

    题目 输入格式 输出格式 输入样例 //样例太长就不贴了.... 输出样例 //见原题 提示 题解 我们将曼哈顿距离式子中的绝对值去掉,每次只考虑x,y比当前点小的更新答案. 为了使所有点都对答案进行 ...

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

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

随机推荐

  1. BestCoder Round #11 (Div. 2)

    太菜,仅仅能去Div2.(都做不完 ORZ... 各自是 HDU: 5054pid=5054"> Alice and Bob 5055Bob and math problem 5056 ...

  2. 流水线技术原理和Verilog HDL实现

    所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行.这使得操作执行速度只与流水线输入的速度有关,而与处理所需的时 ...

  3. python 批量下载文件

    file.txt 的内容为: http://183.xxx.xxx.54:188/my/qqq.ico::qq.exe::0::http://183.xxx.xxx.54:186/my/ddnf.ic ...

  4. CMDB学习之七-实现采集错误捕捉,日志信息处理

    首先采集disk的具体实现方上代码: # !/usr/bin/env python # -*- coding:utf-8 -*- from .base import BasePlugin import ...

  5. Android中Service的一个Demo例子

    Android中Service的一个Demo例子  Service组件是Android系统重要的一部分,网上看了代码,很简单,但要想熟练使用还是需要Coding.  本文,主要贴代码,不对Servic ...

  6. [Python] Understand Mutable vs. Immutable objects in Python

    In this lesson, you will learn what mutable and immutable objects are, and the difference between th ...

  7. Visual Studio Set Project Environment Variables

    Visual Studio Set Project Environment Variables eryar@163.com In Visual Studio you can specify chang ...

  8. Spark scheduler

    触发Spark scheduler的入口是调用者代码中的action操作,如groupByKey,first,take,foreach等操作.这些action操作最终会调用SparkContext.r ...

  9. mvn本地执行java程序

    mvn -f pom.xml compile exec:java -Dexec.classpathScope=compile -Dexec.mainClass=storm.starter.WordCo ...

  10. celery work logging 问题

    celery 的日志里只输出日志 不输入标准打印