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

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源码下载

    Android源码下载 1.安装git 2.安装repo 从这里 https://dl-ssl.google.com/dl/googlesource/git-repo/repo 下载repo文件 3. ...

  2. Android第三方应用分享图文到微信朋友圈 & 微信回调通知分享状态

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWQAAAKUCAIAAAC8A9XzAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWX ...

  3. node.js介绍

    官网说明: Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable ...

  4. 机房收费系统之vb报表的模板的制作(一)

           机房收费系统有报表的功能,报表对于我们来说有点陌生.这不是会计的事吗?怎么机房收费系统也參合进来了,事实上我们学会了报表的步骤.理解了代码后.报表变得不是非常难,世上无难事,仅仅怕肯登攀 ...

  5. [Web远程wsshd]CentOS6.4搭建配置wssh

    wssh 是一个 SSH 到 WebSockets 的桥,可以让你通过 HTTP 调用远程服务器的 SHELL 命令.wssh 可以让我们通过 HTTP 来调用远程的一个 shell,也就是说我们可以 ...

  6. doGet与doPost的区别

    转自:http://blog.csdn.net/luoweifu/article/details/7865243   目录(?)[-] 不同点一 不同点二 输入表单inputhtml Serlvlet ...

  7. Openlayers 自定义控件

    OpenLayers.Control.YourControl = OpenLayers.Class(OpenLayers.Control, { // may private properties he ...

  8. C++中联合体(union)的使用

    typedef union para { ]; struct { double a; double b; double c; double d; }NP; }NPara; //或者如下所示 union ...

  9. hdu 4639 Hehe (dp)

    一道dp题,转移方程不是自己推出来的. 题目的意思是用‘qnmlgb’替换‘hehe’,可以替换也可以不替换,问有多少种情况. 如果结尾不是‘hehe’,那么dp[i]=dp[i-1],如果是是‘he ...

  10. Linux学习之head命令

    head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾. 1.命令格式: hea ...