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. jquery 常用选择器 回顾 ajax() parent() parents() children() siblings() find() eq() has() filter() next()

    1. $.ajax() ajax 本身是异步操作,当需要将 异步 改为 同步时: async: false 2.parent()  父级元素  和  parents() 祖先元素 的区别 parent ...

  2. Android studio 百度地图开发(2)地图定位

    Android studio 百度地图开发(2)地图定位 email:chentravelling@163.com 开发环境:win7 64位,Android Studio,请注意是Android S ...

  3. Java单例的实现

    1.声明实例变量(静态) 2.私有化构造函数 3.创建获取实例的方法 public class Singleton{ //创建实例变量 private static Singleton singlet ...

  4. Deep Learning for Robotics 资源汇总

    1 前言 在最新Nature的Machine Intelligence 中Lecun.Hinton和Bengio三位大牛的Review文章Deep Learning中.最后谈The Future Of ...

  5. linux 输入子系统(1) -Event types

    输入系统协议用类型types和编码codecs来表示输入设备的值并用此来通知用户空间的应用程序. input协议是一个基于状态的协议,只有当相应事件编码对应的参数值发生变化时才会发送该事件.不过,状态 ...

  6. php输出echo、print、print_r、printf、sprintf、var_dump比较

    php输出echo.print.print_r.printf.sprintf.var_dump比较 一.echo    echo() 实际上不是一个函数,是php语句,因此您无需对其使用括号.不过,如 ...

  7. 图像处理之 opencv 学习---矩阵的操作

    OpenCV的一些操作,如生成随机矩阵,高斯矩阵,矩阵相乘之类的 /*功能:说明矩阵的一些操作方法*/#include "cv.h"//该头文件包含了#include " ...

  8. Finally语句块的运行

    一.finally语句块是否一定运行? Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被运行?非常多人都说不是.当然他们的回答是正确的,经过试验. ...

  9. 设计模式学习笔记——Decorator装饰模式

    装饰模式的作用或动机就是,尽量避免继承,而使用关联.原因是层层继承下来,内容会越来越多,有失控的危险.就扩展性而言,用关联比用继承好.所谓的关联,A使用了B,就叫A关联了B. Component 抽象 ...

  10. Gym - 101164C - Castle KMP

    题目链接:传送门 题解: 利用KMP的fail失配数组,快速找到当前后缀与前缀的公共前缀点 #include<bits/stdc++.h> using namespace std; #pr ...