开始给出平面上\(n\)个点,\(m\)个操作,每次加一个点或者查询一个点的曼哈顿距离最近点的曼哈顿距离。(坐标为整数)。

\(n,m\le 5\times 10^5\)。

分析

首先KD-Tree的做法是错误的,一个经典的例子是给出\(n\)个点的圆,询问圆心。

如果这个问题是只统计一个角方向(一个点左下方,右下方,右上方,左上方的曼哈顿距离最近点)的,那么可以排序加线段树解决。又因为这个问题满足加法,所以我们对每个方向做一次就好啦。

那动态插入怎么办呢?使用cdq分治,每次统计前一半的点对后一半的询问的贡献,由于满足加法,所以可以这样做。

复杂度为\(O(nlog^2n)\)。

由于是角方向,所以可以发现查询总是查询\([1,r]\)或者\([l,max]\)之间的最小值,所以可以维护两个相反的树状数组来代替常数大的线段树。

代码

没有办法再优化了,还是过不了啊!!精神上过了。

#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#include<sys/mman.h>
#include<sys/stat.h>
#define lowbit(x) (x&-x)
struct BufferedInputStream {char *buf,*p;int size;inline void init() {register int fd=fileno(stdin);struct stat sb;fstat(fd, &sb);size=sb.st_size;buf=reinterpret_cast<char *>(mmap(0, size, PROT_READ, MAP_PRIVATE, fileno(stdin), 0));p=buf;                                                      }inline char gchar() {return (p==buf+size || *p==-1)?-1:*p++;             }
} str;
using std::sort;
using std::fill;
inline int read() {register int x=0,f=1;register char c=str.gchar();for (;!isdigit(c);c=str.gchar()) if (c=='-') f=-1;for (;isdigit(c);c=str.gchar()) x=x*10+c-'0';return x*f;
}
inline void write(int &x) {if (!x) putchar('0'); else {static char s[15];register int tot=0;while (x) s[++tot]=x%10+'0',x/=10;while (tot) putchar(s[tot--]);}putchar('\n');
}
const int maxn=2.1e6+10;
const int maxp=1e6+10;
const int inf=1e8+10;
struct node {int x,y;node (int x=0,int y=0):x(x),y(y) {}inline bool operator == (const node &a) const {return x==a.x && y==a.y;}inline bool operator < (const node &a) const {return y==a.y?x<a.x:y<a.y;}
};
struct Q {int tp,id;node p;
} a[maxn],b[maxn];
inline bool cmp1(const Q &a,const Q &b) {return a.p==b.p?a.tp<b.tp:a.p<b.p;
}
inline bool cmp2(const Q &a,const Q &b) {return a.p==b.p?a.tp>b.tp:a.p<b.p;
}
inline int min(const int &x,const int &y) {return x<y?x:y;}
inline void Min(int &x,const int y) {x=min(x,y);
}
int ans[maxn],n,m;
struct BIT {struct array {int a[maxp],t[maxp],clc;inline int & operator [] (const int &x) {if (t[x]!=clc) t[x]=clc,a[x]=inf;return a[x];}} a,b;BIT () {clr();}inline void clr() {++a.clc;++b.clc;}inline void insert(int p,const int d) {for (register int i=p;i<maxp;i+=lowbit(i)) Min(a[i],d);p=maxp-p;for (register int i=p;i<maxp;i+=lowbit(i)) Min(b[i],d); }inline int query(int l,const int r) {register int ret=inf;if (l==1) {for (register int i=r;i;i-=lowbit(i)) Min(ret,a[i]);} else if (r==maxp-1) {l=maxp-l;for (register int i=l;i;i-=lowbit(i)) Min(ret,b[i]);}return ret;}
} sgt;
void solve(const int l,const int r) {if (l==r) return;register int mid=(l+r)>>1,all=0;solve(l,mid);solve(mid+1,r);for (register int i=l;i<=mid;++i) if (!a[i].tp) b[++all]=a[i];for (register int i=mid+1;i<=r;++i) if (a[i].tp) b[++all]=a[i];sort(b+1,b+all+1,cmp1);sgt.clr();for (register int i=1,j;i<=all;i=j+1) {for (j=i;j<all && b[j+1].p.y==b[i].p.y;++j);for (register int k=i;k<=j;++k) if (!b[k].tp) sgt.insert(b[k].p.x,-b[k].p.x-b[k].p.y); else Min(ans[b[k].id],b[k].p.x+b[k].p.y+sgt.query(1,b[k].p.x));}sgt.clr();for (register int i=all,j;i;i=j-1) {for (j=i;j>1 && b[j-1].p.y==b[i].p.y;--j);for (register int k=j;k<=i;++k) if (!b[k].tp) sgt.insert(b[k].p.x,b[k].p.y-b[k].p.x); elseMin(ans[b[k].id],b[k].p.x-b[k].p.y+sgt.query(1,b[k].p.x));}sort(b+1,b+all+1,cmp2);sgt.clr();for (register int i=1,j;i<=all;i=j+1) {for (j=i;j<all && b[j+1].p.y==b[i].p.y;++j);for (register int k=j;k>=i;--k) if (!b[k].tp) sgt.insert(b[k].p.x,b[k].p.x-b[k].p.y); elseMin(ans[b[k].id],b[k].p.y-b[k].p.x+sgt.query(b[k].p.x,maxp-1));}sgt.clr();for (register int i=all,j;i;i=j-1) {for (j=i;j>1 && b[j-1].p.y==b[i].p.y;--j);for (register int k=i;k>=j;--k) if (!b[k].tp) sgt.insert(b[k].p.x,b[k].p.x+b[k].p.y); else Min(ans[b[k].id],-b[k].p.x-b[k].p.y+sgt.query(b[k].p.x,maxp-1));}
}
int main() {
#ifndef ONLINE_JUDGEfreopen("test.in","r",stdin);freopen("my.out","w",stdout);
#endifstr.init();n=read(),m=read();fill(ans+1,ans+m+1,inf);for (register int i=1;i<=n;++i) {int x=read()+1,y=read()+1;a[i]=(Q){0,0,node(x,y)};}for (register int i=1;i<=m;++i) {int tp=read()-1,x=read()+1,y=read()+1;a[i+n]=(Q){tp,i,node(x,y)};}solve(1,n+m);for (register int *i=ans+1,*ed=ans+m+1;i!=ed;++i) if (*i<=(int)2e6) write(*i);return 0;
}

转载于:https://www.cnblogs.com/owenyu/p/6912407.html

bzoj2716-天使玩偶相关推荐

  1. BZOJ2716天使玩偶

    不会KD-tree怎么办?CQD硬搞. 建立正常的平面直角坐标系,首先我们只考虑在目标点左下角的点对目标点的贡献,由于左下点的横纵坐标都小于目标点,那么曼哈顿距离就可以化简了,绝对值去掉后,得到$x2 ...

  2. bzoj2716 天使玩偶

    传送门 用之前的那种估值函数过不去.. 要记录每个点所包含的最大范围才过得去,每次查就看查询点与这个范围的最小可能距离.搜的时候先搜估值距离小的. 如果插入的点超过一定数量就重构一下,防止过于不平衡, ...

  3. [KDTree] [BZOJ2716] [Violet 3] 天使玩偶

    题目描述 Description Ayu在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后的今天,Ayu却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们 ...

  4. bzoj2716 [Violet 3]天使玩偶(KDtree)

    题目描述 Ayu在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们把Ayu生活的小镇看作 ...

  5. bzoj2716 [Violet 3]天使玩偶

    2716: [Violet 3]天使玩偶 Time Limit: 80 Sec  Memory Limit: 128 MB Submit: 2160  Solved: 936 [Submit][Sta ...

  6. BZOJ2648: SJY摆棋子2716: [Violet 3]天使玩偶

    BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...

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

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

  8. 天使玩偶/SJY摆棋子

    P4169 [Violet]天使玩偶/SJY摆棋子 CDQ分治的题目. 我们发现题目要我们求的\(|A_x-B_x|+|A_y-B_y|\)的绝对值号比较恶心. 试想一下怎么去掉 如果所有的点都在我们 ...

  9. bzoj 2648: SJY摆棋子2716: [Violet 3]天使玩偶 --kdtree

    2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec  Memory Limit: 128 MB Description 这天,S ...

  10. BZOJ 2716/CH 4701 天使玩偶

    [题意] Ayu在七年前曾经收到过一个天使玩偶,当时她把它当做时间囊埋在了地下. 而七年后的今天,Ayu却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们把Ayu生活的小镇看做 ...

最新文章

  1. 【每日一题】502. IPO
  2. position属性及实现图片垂直居中
  3. 在Grails战争中添加“精简” Groovy Web控制台
  4. python3图片转代码_python3图片转换二进制存入mysql示例代码
  5. python都可以开发什么_Python的优势到底是什么?Python都能开发什么?
  6. 自动部署java项目,热部署方式
  7. “易图购”数码商城App设计与实现
  8. 超好用的纸飞机串口调试助手,支持绘图和关键字高亮
  9. 四十八种微信公众号加人方法
  10. 4招教你们怎么做海报,想要宣传推广就来这
  11. opencv 颜色识别
  12. 中图分类号计算机 tp,中图分类号(TP)
  13. Eclipse插件(RCP)自定义编辑器添加Dirty效果
  14. 北京图灵学院 Python(02)
  15. 查题接口 源码 php 爬题,知到网课答案WEB程序设计(PHP)查题公众号
  16. WebGL/ThreeJS如何在场景中创建立体文字TextGeometry,认识精灵模型
  17. 【水滴石穿】github_popular
  18. MPU6500驱动调试笔记(STM32F407+SPI)
  19. Android 系统服务 - PMS 的启动过程
  20. 宝塔上的wordpress站点更换域名+配置SSL+改版百度收录

热门文章

  1. Android设备信息获取
  2. VSCode生产工具详细配置
  3. linux系统版搜狗输入法下载官网,搜狗输入法Linux版
  4. Ubuntu14.04 安装教程(U盘及硬盘)
  5. 抽烟行为识别预警系统 yolov5
  6. Oracle学习——表空间管理(二)
  7. php505,php – HTTP / 1.1 505 HTTP版本不支持
  8. audio 监听播放进度
  9. MyBatis Plus简介和入门案例
  10. Maven学习(二) -- 坐标和依赖(转自--江湖小妞)