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. C++简单实现对象引用计数示例(转)

    C++简单实现对象引用计数示例 #include <iostream> #include <stdio.h> using namespace std; class String ...

  2. Raw-OS源代码分析之消息系统-Queue_Buffer

    分析的内核版本号截止到2014-04-15,基于1.05正式版.blogs会及时跟进最新版本号的内核开发进度,若源代码凝视出现"???"字样,则是未深究理解部分. Raw-OS官方 ...

  3. Effective C++ 条款三 尽可能使用const

    参考资料:http://blog.csdn.net/bizhu12/article/details/6672723      const的常用用法小结 1.用于定义常量变量,这样这个变量在后面就不可以 ...

  4. wxWidgets刚開始学习的人导引(6)——wxWidgets学习材料清单

    wxWidgets刚開始学习的人导引全文件夹   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wx ...

  5. mac系统下为emacs设置中文字体,解决乱码问题

    近期换了个系统,如今用mac系统. 当打开emacs后,中文支持的不是非常好.有的地方能显示.在.el文件的凝视里显示为口口口口口口口口这种框.例如以下图所看到的 找了半天.是由于中文字体的问题.仅仅 ...

  6. python xmlrpc

    rpc 协议 RPC = Remote Procedure Call Protocol,即远程过程调用协议. xml rpc 协议 使用http协议作为传输协议,使用xml文本传输命令和数据的一种协议 ...

  7. POJ 3414:Pots

    Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11661   Accepted: 4940   Special J ...

  8. visual studio 2013 update 3正式版出来了

    微软的更新速度还是蛮快的吗.新版本号出来了,大家快下载体验一下吧,详细下载地址在http://www.visualstudio.com/zh-cn/downloads/download-visual- ...

  9. VC断点失败的原因之中的一个

    VC断点失败的原因之中的一个 flyfish 2014-10-23 情景 再debug状态下仅仅有一个cpp文件.命中不了断点. 提示 能够 同意源码与原始版本号不同 不採用,防止出现未知的隐患 问题 ...

  10. 设计模式学习笔记——Mediator中介者模式

    将众多对象之间的网状关系转为全部通过一个中间对象间接发生关系,此中间对象为中介者. 看图最直观: 作用不言而喻,就是降低对象之间的耦合度,乃至降低了整个系统的复杂度. 有点象代理模式,更象外观模式: