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. ActiveMQ(二) 转

    package pfs.y2017.m11.mq.activemq.demo02; import java.util.concurrent.atomic.AtomicInteger; import j ...

  2. Linux fcntl函数详解

    功能描述:根据文件描述词来操作文件的特性. 文件控制函数          fcntl -- file control 头文件: #include <unistd.h> #include ...

  3. C++ string 实现大整数相加减

    随意两个大整数的加减算法.可自己主动推断正负号.代码例如以下: #include <iostream> #include <vector> #include <cstri ...

  4. monitor and move the log content to our big data system

    Apache Flume HDFS Sink Tutorial | HowToProgram https://howtoprogram.xyz/2016/08/01/apache-flume-hdfs ...

  5. ruby hash排序

    参考文章:http://blog.csdn.net/ppp8300885/article/details/49933305 a={a:1,b:20,c:3,d:0,e:7}逆序 a.sort{|k,v ...

  6. POJ1426 Find The Multiple —— BFS

    题目链接:http://poj.org/problem?id=1426 Find The Multiple Time Limit: 1000MS   Memory Limit: 10000K Tota ...

  7. JavaScript实现Map、Reduce和Filter

    1. [代码][JavaScript]代码     <script type="text/javascript">// 函数式编程:// 描述我们要做什么,而不是我们如 ...

  8. 不用打开Eclipse就可以执行的命令

    1.android 弹出Android SDK and AVD Manager2.android list avds 列出所有创建的Android模拟器3.android list targets 列 ...

  9. ios打印frame等格式

    1.打印frame:NSLog(@"%@",NSStringFromCGRect(pickerView.frame)); 或者CFShow(NSStringFromCGRect(p ...

  10. Windows命令行bat批处理延迟sleep方法

    使用ping 的定时功能,精度1秒 实战:创建示例文件test.bat,内容如下: 代码如下:ping -n 3 127.0.0.1>nul 说明:3为ping包发送次数,可作为延迟秒数进行使用 ...