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

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. Google的兼容包问题【转】

    转自:http://blog.sina.com.cn/s/blog_3e28c8a50101g14g.html 项目之前好好的,今天开Eclipse,,出错. 错误Error retrieving p ...

  2. ecshop的小总结

    1 为防止非法调用自己的页面,在被包含页面加上: if (!defined('IN_ECS'))  {die('Hacking attempt'); } 2 在主动包含页面要定义define('IN_ ...

  3. JavaScript压缩混淆 / 格式化 / 美化工具 - aTool在线工具

    原文地址:http://www.atool.org/jscompression.php

  4. hdu 2769 uva 12169 Disgruntled Judge 拓展欧几里德

    //数据是有多水 连 10^10的枚举都能过 关于拓展欧几里德:大概就是x1=y2,y1=x2-[a/b]y2,按这个规律递归到gcd(a,0)的形式,此时公因数为a,方程也变为a*x+0*y=gcd ...

  5. 经典排序算法(Java实现)

    以下程序均将数据封装于DataWrap数据包装类中,如下所示: //数据包装类 class DataWrap implements Comparable<DataWrap> { int d ...

  6. JQuery(上)

    1.流行的JavaScript类库   --  框架.插件 )为了简化 JavaScript 的开发, 一些 JavsScript 库诞生了. JavaScript 库封装了很多预定义的对象和实用函数 ...

  7. CodeForces 540B School Marks(思维)

    B. School Marks time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  8. BestCoder Round #14

    Harry And Physical Teacher Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  9. Twitter 新一代流处理利器——Heron 论文笔记之Heron架构

    Twitter 新一代流处理利器--Heron 论文笔记之Heron架构 标签(空格分隔): Streaming-process realtime-process Heron Architecture ...

  10. C#获取单个字符的拼音声母

    public class ConvertToPinYing     {         /// <summary>         /// 汉字转拼音缩写         /// < ...