KD-tree可做,但是我不会暂时不考虑

大意:在二维平面内,给定n个点,m个操作。操作A:加入一个点;操作B:询问一个点与平面上加入的点的最近距离

不封装会T不封装会T不封装会T不封装会T不封装会T不封装会T不封装会T不封装会T不封装会T不封装会T不封装会T

把初始存在的点也看成加点操作

首先,曼哈顿距离取绝对值很烦,所以我们可以通过转坐标,把左上 右上 左下 右下通过转坐标都变成左下,最后取个min即可。于是对于(x,y)左下的点(x1,y1),dis=x-x1+y-y1=(x+y)-(x1+y1),用树状数组维护前缀最小值x1+y1。

按时间序排列,时间序 x y 三维偏序做CDQ分治即可

 #include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=,inf=1e9;
int n,m,maxx,ans[N];
struct BIT
{
int c[N];
int lb(int x)
{
return x&(-x);
}
void update(int x,int d)
{
for(int i=x;i<=maxx;i+=lb(i))
c[i]=max(c[i],d);
}
int ques(int x)
{
int ret=;
for(int i=x;i>=;i-=lb(i))
ret=max(ret,c[i]);
return ret;
}
void clear(int x)
{
for(int i=x;i<=maxx;i+=lb(i))
c[i] = ;
}
}bit;
struct qwe
{
int x,y,k,id;
bool operator < (const qwe& rhs) const
{
if(x != rhs.x)
return x < rhs.x;
return id < rhs.id;
}
}a[N];
struct CDQ
{
int n;
qwe T[N];
void init(int n)
{
this->n=n;
sort(a+,a+n+);
}
void solve(int L, int R)
{
if(L>=R)
return;
int M=(L+R)>>;
int p=L,q=M+;
for(int i=L;i<=R;i++)
if(a[i].id<=M)
T[p++]=a[i];
else
T[q++]=a[i];
for(int i=L;i<=R;i++)
a[i]=T[i];
solve(L,M);
solve(M+,R);
int i=M+,j=L;
for(;i<=R;i++)
if(a[i].k==)
{
for(;j<=M&&a[j].x<=a[i].x;j++)
if(a[j].k==)
bit.update(a[j].y,a[j].x+a[j].y);
int t=bit.ques(a[i].y);
if(t)
ans[a[i].id]=min(ans[a[i].id],a[i].x+a[i].y-t);
}
for(int i=L;i<j;i++)
if(a[i].k==)
bit.clear(a[i].y);
merge(a+L,a+M+,a+M+,a+R+,T+L);
for(int i=L;i<=R;i++)
a[i]=T[i];
}
}cdq;
int read()
{
int r=;
char p=getchar();
while(p>''||p<'')
p=getchar();
while(p>=''&&p<='')
{
r=r*+p-;
p=getchar();
}
return r;
}
int main()
{
n=read(),m=read();
for(int i=;i<=n;i++)
{
a[i].x=read()+;
a[i].y=read()+;
a[i].id=i;
a[i].k=;
maxx=max(maxx,max(a[i].x,a[i].y));
}
for(int i=n+;i<=n+m;i++)
{
a[i].k=read();
a[i].x=read()+;
a[i].y=read()+;
a[i].id=i;
maxx=max(maxx,max(a[i].x,a[i].y));
}
maxx++;
n+=m;
for(int i=;i<=n;i++)
ans[i]=inf;
cdq.init(n);
cdq.solve(,n);
for(int i=;i<=n;i++)
a[i].x=maxx-a[i].x;
cdq.init(n);
cdq.solve(,n);
for(int i=;i<=n;i++)
a[i].y=maxx-a[i].y;
cdq.init(n);
cdq.solve(,n);
for(int i=;i<=n;i++)
a[i].x=maxx-a[i].x;
cdq.init(n);
cdq.solve(,n);
for(int i=;i<=n;i++)
if(ans[i]!=inf)
printf("%d\n",ans[i]);
return ;
}

bzoj 2716 [Violet 3]天使玩偶 【CDQ分治】的更多相关文章

  1. BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )

    先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了. --------------------------------- ...

  2. BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个 ...

  3. BZOJ 2716 Violet 3 天使玩偶 CDQ分治

    题目大意:初始给定平面上的一个点集.提供两种操作: 1.将一个点增加点集 2.查询距离一个点最小的曼哈顿距离 K-D树是啥...不会写... 我仅仅会CDQ分治 对于一个询问,查询的点与这个点的位置关 ...

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

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

  5. BZOJ 2716: [Violet 3]天使玩偶

    2716: [Violet 3]天使玩偶 Time Limit: 80 Sec  Memory Limit: 128 MBSubmit: 1473  Solved: 621[Submit][Statu ...

  6. bzoj 2716 [Violet 3]天使玩偶——KDtree

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2716 第三道KDtree!仍旧是模板.还有CDQ分治做法,见下面. 数组迷之开大?(开6e5 ...

  7. BZOJ 2716 [Violet 3]天使玩偶 ——KD-Tree

    [题目分析] KD-Tree的例题.同BZOJ2648. [代码] #include <cstdio> #include <cstring> #include <cstd ...

  8. bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree

    2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec  Memory Limit: 128 MB Description 这天,S ...

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

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

随机推荐

  1. angular1.x 组件开发

    搜索框组件开发: 1.注册组件 app.js angular.module("myApp",[]) .component("nameSearch",{ temp ...

  2. Multiple analytic account plans多辅助核算方案

    定义核算方案     菜单 会计/设置/辅助核算会计/多个方案         点击"创建"按钮         说明 辅助核算方案,输入方案名称     点击"添加一个 ...

  3. Linux变量内容的删除、代替与替换

    变量内容的删除与代替 范例一:先让小写的 path 自己定义变量配置的与 PATH 内容同样 [root@www ~]# path=${PATH} [root@www ~]# echo $path / ...

  4. Maple入门使用教程

    http://anony3721.blog.163.com/blog/static/51197420105173915247/ 命令的运行:1.每条命令必须用":"(运行后不显示) ...

  5. python的pexpect模块

    Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块. P ...

  6. 【献给CWNU的师弟】Web篇

    2014年10月8日 献给CWNU的师弟

  7. SpringMVC中返回JSON时乱码的解决方案

    springMVC中返回JSON会出现乱码,解决如下: produces = "text/html;charset=UTF-8" @ResponseBody @RequestMap ...

  8. Java WebSocket库:https://github.com/TooTallNate/Java-WebSocket

    https://github.com/TooTallNate/Java-WebSocket 以下是简单示例: import com.google.gson.JsonObject; import com ...

  9. JVM学习资料收集

    JVM实用参数(一)JVM类型以及编译器模式 http://ifeve.com/useful-jvm-flags-part-1-jvm-types-and-compiler-modes-2/ JVM实 ...

  10. RegistryView

    https://docs.microsoft.com/en-us/dotnet/api/microsoft.win32.registryview?view=netframework-4.7 On th ...