题目大意:初始给定平面上的一个点集。提供两种操作:

1.将一个点增加点集

2.查询距离一个点最小的曼哈顿距离

K-D树是啥。。。不会写。。。

我仅仅会CDQ分治

对于一个询问,查询的点与这个点的位置关系有四种,我们如今仅仅讨论左下角,剩余三个象限同理

设询问的点为(x,y),查询的点为(x',y')

则dis=(x-x')+(y-y')=(x+y)-(x'+y')

于是我们要找到查询的点左下方全部点中x'+y'最大的点。x值排序,y值维护树状数组就可以

用CDQ分治化在线为离线。保证x有序就可以

其他三个象限同理 记得讨论的时候别写差了 细致检查一下为好

此题80s真吓人。。

只是全然没有那么慢,不管是K-DTree还是CDQ分治都是半分钟解决这个问题。。。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 500500
using namespace std;
struct point{
int x,y;
bool operator < (const point &p) const
{
return x < p.x;
}
}points[M];
struct abcd{
int p,x,y,pos,dis;
bool operator < (const abcd &z) const
{
if( x == z.x )
return pos < z.pos;
return x < z.x;
}
}q[M],nq[M];
int n,m,tot,maxnum;
int c[1001001],tim[1001001];
inline int getc() {
static const int L = 1 << 15;
static char buf[L], *S = buf, *T = buf;
if (S == T) {
T = (S = buf) + fread(buf, 1, L, stdin);
if (S == T)
return EOF;
}
return *S++;
}
inline int getint() {
int c;
while(!isdigit(c = getc()) && c != '-');
bool sign = c == '-';
int tmp = sign ? 0 : c - '0';
while(isdigit(c = getc()))
tmp = (tmp << 1) + (tmp << 3) + c - '0';
return sign ? -tmp : tmp;
}
inline void output(int x)
{
static int a[20];
if (x == 0)
putchar('0');
else {
int top = 0;
if (x < 0)
putchar('-'), x=-x;
while(x) {
a[++top] = x % 10;
x /= 10;
}
for(int i = top; i >= 1; --i)
putchar('0' + a[i]);
}
puts("");
}
void Update(int x,int y,int flag)
{
for(;x&&x<=maxnum;x+=(x&-x)*flag)
{
if(tim[x]!=tot)
c[x]=0xefefefef,tim[x]=tot;
c[x]=max(c[x],y);
}
}
int Get_Ans(int x,int flag)
{
int re=0xefefefef;
for(;x&&x<=maxnum;x+=(x&-x)*flag)
if(tim[x]==tot)
re=max(re,c[x]);
return re;
}
void CDQ(int l,int r)
{
int i,j,mid=l+r>>1;
int l1=l,l2=mid+1;
if(l==r)
{
if(q[mid].p==2)
output(q[mid].dis);
return ;
}
for(i=l;i<=r;i++)
{
if(q[i].pos<=mid)
nq[l1++]=q[i];
else
nq[l2++]=q[i];
}
memcpy( q+l , nq+l , sizeof(q[0])*(r-l+1) );
CDQ(l,mid);
for(++tot,j=l,i=mid+1;i<=r;i++)
if(q[i].p==2)
{
for(;j<=mid&&q[j].x<=q[i].x;j++)
if(q[j].p==1)
Update(q[j].y,q[j].x+q[j].y,1);
q[i].dis=min(q[i].dis,q[i].x+q[i].y-Get_Ans(q[i].y,-1) );
}
for(++tot,j=l,i=mid+1;i<=r;i++)
if(q[i].p==2)
{
for(;j<=mid&&q[j].x<=q[i].x;j++)
if(q[j].p==1)
Update(q[j].y,q[j].x-q[j].y,-1);
q[i].dis=min(q[i].dis,q[i].x-q[i].y-Get_Ans(q[i].y,1) );
}
for(++tot,j=mid,i=r;i>mid;i--)
if(q[i].p==2)
{
for(;j>=l&&q[j].x>=q[i].x;j--)
if(q[j].p==1)
Update(q[j].y,q[j].y-q[j].x,1);
q[i].dis=min(q[i].dis,q[i].y-q[i].x-Get_Ans(q[i].y,-1) );
}
for(++tot,j=mid,i=r;i>mid;i--)
if(q[i].p==2)
{
for(;j>=l&&q[j].x>=q[i].x;j--)
if(q[j].p==1)
Update(q[j].y,-q[j].x-q[j].y,-1);
q[i].dis=min(q[i].dis,-q[i].x-q[i].y-Get_Ans(q[i].y,1) );
}
CDQ(mid+1,r);
l1=l;l2=mid+1;
for(i=l;i<=r;i++)
{
if(q[l1]<q[l2]&&l1<=mid||l2>r)
nq[i]=q[l1++];
else
nq[i]=q[l2++];
}
memcpy( q+l , nq+l , sizeof(q[0])*(r-l+1) );
}
int main()
{
int i,j;
cin>>n>>m;
for(i=1;i<=n;i++)
{
points[i].x=getint();
points[i].y=getint();
++points[i].x;++points[i].y;
maxnum=max(maxnum,points[i].y);
}
sort(points+1,points+n+1);
for(i=1;i<=m;i++)
{
q[i].p=getint();
q[i].x=getint();
q[i].y=getint();
++q[i].x;++q[i].y;
q[i].pos=i;
q[i].dis=0x3f3f3f3f;
maxnum=max(maxnum,q[i].y);
}
sort(q+1,q+m+1);
for(++tot,j=1,i=1;i<=m;i++)
if(q[i].p==2)
{
for(;j<=n&&points[j].x<=q[i].x;j++)
Update(points[j].y,points[j].x+points[j].y,1);
q[i].dis=min(q[i].dis,q[i].x+q[i].y-Get_Ans(q[i].y,-1) );
}
for(++tot,j=1,i=1;i<=m;i++)
if(q[i].p==2)
{
for(;j<=n&&points[j].x<=q[i].x;j++)
Update(points[j].y,points[j].x-points[j].y,-1);
q[i].dis=min(q[i].dis,q[i].x-q[i].y-Get_Ans(q[i].y,1) );
}
for(++tot,j=n,i=m;i;i--)
if(q[i].p==2)
{
for(;j&&points[j].x>=q[i].x;j--)
Update(points[j].y,points[j].y-points[j].x,1);
q[i].dis=min(q[i].dis,q[i].y-q[i].x-Get_Ans(q[i].y,-1) );
}
for(++tot,j=n,i=m;i;i--)
if(q[i].p==2)
{
for(;j&&points[j].x>=q[i].x;j--)
Update(points[j].y,-points[j].x-points[j].y,-1);
q[i].dis=min(q[i].dis,-q[i].x-q[i].y-Get_Ans(q[i].y,1) );
}
CDQ(1,m);
return 0;
}

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. [BZOJ2716] [Violet 3]天使玩偶(CDQ分治)

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

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

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

  5. bzoj 2716 [Violet 3]天使玩偶 【CDQ分治】

     KD-tree可做,但是我不会暂时不考虑 大意:在二维平面内,给定n个点,m个操作.操作A:加入一个点:操作B:询问一个点与平面上加入的点的最近距离 不封装会T不封装会T不封装会T不封装会T不封装会 ...

  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. Android客户端与服务器交互中的token

    学习Token Token是什么? Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Tok ...

  2. 开源语音识别系统 Simon

    http://www.lupaworld.com/proj.php?mod=view&cid=&id=824 语音识别系统 Simon:Simon 是一个开源的语音识别系统,它不仅可以 ...

  3. 【转】Logistic regression (逻辑回归) 概述

    Logistic regression (逻辑回归)是当前业界比较常用的机器学习方法,用于估计某种事物的可能性.比如某用户购买某商品的可能性,某病人患有某种疾病的可能性,以及某广告被用户点击的可能性等 ...

  4. java操作mysql的增删改查

    prepareStatement(sql)是statement的子类,比statement好用. 如果数据库中定义的是int值,那么sql语句中要把int单独提出来.如".....value ...

  5. KVC在定义Model类中的妙用

    @我们应用程序使用MVC架构的话,对于处理数据类,我们会单独的定义Model类,在里面为要展示的属性进行初始化赋值,一般採用的方法是通过定义相应的属性,挨个赋值.如今我要介绍的就是通过KVC,key- ...

  6. Linux内核源代码解析——用户发送数据包的起源之sendto

    本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/10162853 Jack:我想知道用户如何把数据发送到 ...

  7. window.onload()与$(document).ready()区别

    浏览器加载完DOM后,会通过javascript为DOM元素添加事件,在javascript中,通常使用window.onload()方法. 在jquery中,则使用$(document).ready ...

  8. CRM odata方法如何使用$top

    odata方法 $top $top1 取1个 ¥top100取100个,放在$select前,中间用&符号隔开. 例如: var activeserviceReq = "/xrmse ...

  9. [Android]Plug-in com.android.ide.eclipse.adt was unable to load class com.android.ide

    今天启动eclipse的时候报了上述错误,打开xml是都报错.其实解决方法很简单:重启eclipse即可.

  10. Spring-----Spring整合Struts2实例

    转载自:http://blog.csdn.net/hekewangzi/article/details/51713058