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. 基于matlab的音频波形实时採集显示 v0.1

    robj = audiorecorder(44100,16,1); %设置採样频率.採样位数.通道数 recordblocking(robj,1); %採集初步数据(1s长度) rdata = get ...

  2. php中局部变量和全局变量

    php中局部变量和全局变量 代码1:函数内部使用函数外部变量错误方法 <?php $name = 'fish'; function animal() { echo $name; } animal ...

  3. WebServic调用天气预报服务

    在项目开发中,我们除了发布WebService提供客户调用外,也经常需要调用一些客户或者第三方的WebService服务,这里就通过一个Demo来演示调用一个第三方的天气预报服务. 1.天气预报服务接 ...

  4. The method getDispatcherType() is undefined for the type HttpServletRequest错误解决方法

    使用Eclipse Luna版本,jdk1.7和tomcat8.0开发JAVA EE应用.写一个简单的JSP部署后访问报JSP编译错误,具体错误信息如下: The method getDispatch ...

  5. Cisco路由器交换机配置命令详解

    1. 交换机支持的命令: 交换机基本状态:switch: :ROM状态, 路由器是rommon>hostname> :用户模式hostname# :特权模式hostname(config) ...

  6. Selenium_WebDriver操作iFrame日历框和复选框_Java

    iFrame日历框 页面上遇到iFrame元素时,先用findElement找到这个iFrame元素,然后再WebDriver.switchTo().frame(calFrame).在iFrame里操 ...

  7. log4j+slf4j迁移到log4j2+slf4j (Servlet3.0)

    近期对系统中的旧项目实现log升级,选择了log4j2来取代log4j.作为最新一代的log实现.log4j2好在那里能够直接看log4j2性能章节. 这里写写怎样从log4j升级到log4j2. 1 ...

  8. POJ 3172 (认真读题的题)

    题目: 思路: 题目很有意思 首先 题里说:N<=1000 题里又说 诶呦 woc? 这不自相矛盾嘛 最坏情况也就是个 斐波那契数列 几十个数 暴搜+剪枝不就好了嘛 剪枝:从大往小搜,如果前缀和 ...

  9. 今日SGU 5.9

    SGU 297 题意:就是求余数 收获:无 #include<bits/stdc++.h> #define de(x) cout<<#x<<"=" ...

  10. Jenkins学习总结(3)——Jenkins+Maven+Git搭建持续集成和自动化部署的

    前言 持续集成这个概念已经成为软件开发的主流,可以更频繁的进行测试,尽早发现问题并提示.自动化部署就更不用说了,可以加快部署速度,并可以有效减少人为操作的失误.之前一直没有把这个做起来,最近的新项目正 ...