• 两种操作:1.加入点(x,y); 2.查询距(x,y)最近的点的曼哈顿距离距离

  • 思路:绝对值拆开通常可以取max,不过这里直接分类讨论4种情况,我们发现如果找\(i\)点左下点\(j\)\((x_j<=x_i且y_j<=y_i)\)到\(i\)的最小距离:\(x_i-x_j+y_i-y_j=(x_i+y_i)-(x_j+y_j)\)

    所以使距离最小即让\(x_j+y_j\)尽量大,我们发现这是个三维偏序问题:CDQ分治+树状数组

    以上都是我能想到的,下面就是我菜鸡借鉴的:

    其它三种情况怎么办?

    题解告诉我们,同理!

    其实有技巧的:我们找到x,y的范围上限(len),我们利用len-x,len-y这两种变换即可变幻出四种情况,无论i,j两个点开始在那个方向,都可以变化出j在i的所有方位(当然就包含了左下的情况)。

    因此四次cdq即可。

  • 注意:

    1.树状数组下标不能存0,要把整体坐标+1

    2.C要初始化为-inf而不是0因为在一个(x,y)左下角没有数的时候不应该更新答案

这个cdq的板子还是很优秀的,我没有卡任何常数直接过了

  • 代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+5;
int inf=0x3f3f3f3f,C[N],n,m,tot=0,ans[N],len;
int lowbit(int u) {return u&(-u);}
void Update(int p,int d) {
for(int i=p;i<=len;i+=lowbit(i)) C[i]=max(C[i],d);
}
int Ask(int p) {
int mx=-inf;
for(int i=p;i;i-=lowbit(i)) mx=max(mx,C[i]);
return mx;
}
void Clear(int p) {
for(int i=p;i<=len;i+=lowbit(i)) C[i]=-inf;
}
struct node {
int opt,x,y,id;
}Q[N],a[N],t[N];
void CDQ(int l,int r) {
if(l==r) return;
int mid=(l+r)>>1;
CDQ(l,mid),CDQ(mid+1,r);
int i=l,j=mid+1,c=l;
while(c<=r) {
if((j>r)||(i<=mid&&Q[i].x<=Q[j].x)) {
if(Q[i].opt==1) Update(Q[i].y,Q[i].x+Q[i].y);
t[c++]=Q[i++];
}
else {
if(Q[j].opt==2) ans[Q[j].id]=min(ans[Q[j].id],Q[j].x+Q[j].y-Ask(Q[j].y));
t[c++]=Q[j++];
}
}
for(int k=l;k<=mid;k++) if(Q[k].opt==1) Clear(Q[k].y);
for(int k=l;k<=r;k++) Q[k]=t[k];
}
void _cdq(int fx,int fy) {
for(int i=1;i<=tot;i++) {
Q[i]=a[i];
if(fx) Q[i].x=len-Q[i].x;
if(fy) Q[i].y=len-Q[i].y;
}
CDQ(1,tot);
}
int main() {
memset(ans,0x3f,sizeof(ans));
memset(C,-0x3f,sizeof(C));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) {
++tot;
scanf("%d%d",&a[tot].x,&a[tot].y); a[tot].opt=1,a[tot].id=tot;
a[tot].x++,a[tot].y++;
len=max(len,max(a[tot].x,a[tot].y));
}
for(int i=1;i<=m;i++) {
tot++;
scanf("%d%d%d",&a[tot].opt,&a[tot].x,&a[tot].y);
a[tot].id=tot;
a[tot].x++,a[tot].y++;
len=max(len,max(a[tot].x,a[tot].y));
}
len++;
_cdq(0,0),_cdq(0,1),_cdq(1,0),_cdq(1,1);
for(int i=1;i<=tot;i++) {
if(a[i].opt==2) {
printf("%d\n",ans[i]);
}
}
return 0;
}

P4169 [Violet]天使玩偶的更多相关文章

  1. bzoj2716/2648 / P4169 [Violet]天使玩偶/SJY摆棋子

    P4169 [Violet]天使玩偶/SJY摆棋子 k-d tree 模板 找了好几天才发现输出优化错了....真是zz...... 当子树非常不平衡时,就用替罪羊树的思想,拍扁重建. luogu有个 ...

  2. 洛谷 P4169 [Violet]天使玩偶/SJY摆棋子 解题报告

    P4169 [Violet]天使玩偶/SJY摆棋子 题目描述 \(Ayu\)在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,\(Ayu\) 却忘了她把天使玩偶埋在了哪 ...

  3. 洛谷P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治)

    [Violet]天使玩偶/SJY摆棋子 题目传送门 解题思路 用CDQ分治开了氧气跑过. 将输入给的顺序作为第一维的时间,x为第二维,y为第三维.对于距离一个询问(ax,ay),将询问分为四块,左上, ...

  4. P4169 [Violet]天使玩偶/SJY摆棋子

    题目背景 感谢@浮尘ii 提供的一组hack数据 题目描述 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅 ...

  5. Luogu P4169 [Violet]天使玩偶/SJY摆棋子

    传送门 二维平面修改+查询,cdq分治可以解决. 求关于某个点曼哈顿距离(x,y坐标)最近的点——dis(A,B) = |Ax-Bx|+|Ay-By| 但是如何去掉绝对值呢? 查看题解发现假设所有的点 ...

  6. 洛谷P4169 [Violet]天使玩偶/SJY摆棋子

    %%%神仙\(SJY\) 题目大意: 一个二维平面,有两种操作: \(1.\)增加一个点\((x,y)\) \(2.\)询问距离\((x,y)\)曼哈顿最近的一个点有多远 \(n,m\le 300 0 ...

  7. luoguP4169 [Violet]天使玩偶/SJY摆棋子 K-Dtree

    P4169 [Violet]天使玩偶/SJY摆棋子 链接 luogu 思路 luogu以前用CDQ一直过不去. bzoj还是卡时过去的. 今天终于用k-dtree给过了. 代码 #include &l ...

  8. [Violet]天使玩偶/SJY摆棋子 [cdq分治]

    P4169 [Violet]天使玩偶/SJY摆棋子 求离 \((x,y)\) 最近点的距离 距离的定义是 \(|x1-x2|+|y1-y2|\) 直接cdq 4次 考虑左上右上左下右下就可以了-略微卡 ...

  9. 【LG4169】[Violet]天使玩偶/SJY摆棋子

    [LG4169][Violet]天使玩偶/SJY摆棋子 题面 洛谷 题解 至于\(cdq\)分治的解法,以前写过 \(kdTree\)的解法好像还\(sb\)一些 就是记一下子树的横.纵坐标最值然后求 ...

随机推荐

  1. H5优化:canonical标签该如何正确使用

    对一组内容完全相同或高度相似的网页,通过使用Canonical标签可以告诉搜索引擎哪个页面为规范的网页,能够规范网址并避免搜索结果中出现多个内容相同或相似的页面,帮助解决重复内容的收录问题,避免网站相 ...

  2. 横竖屏切换android:screenOrientation属性的使用

    在开发android的应用中,有时候需要限制横竖屏切换,只需要在AndroidManifest.xml文件中加入android:screenOrientation属性限制.    android:sc ...

  3. php文件下载服务器代码

    事情的起因 额,平板想下载电脑上的pdf文件,我开启了web服务,局域网下的ipad访问该文件web路径会直接打开该pdf,而不是下载.于是本小白就折腾了一下. 源代码 <?php forceD ...

  4. 2.Docker容器学习之新生入门必备基础知识

    0x02 Docker 核心概念 描述:Docker的三大核心概念镜像/容器和仓库, 通过三大对象核心概念所构建的高效工作流程; 1.镜像 [image] 描述:images 类似于虚拟机镜像,借鉴了 ...

  5. Vue 中 axios 跨域配置 (!!!配置完成需要重新运行,不然也不起作用)

    当拿到一个网址如:https://music.163.com/store/api/categorypage/list  获取数据是出现如下: 证明该网址不能非常直观的拿到数据.接下来我们试试跨域拿这个 ...

  6. 阿里巴巴稀疏模型训练引擎-DeepRec

    导读:DeepRec从2016年起深耕至今,支持了淘宝搜索.推荐.广告等核心业务,沉淀了大量优化的算子.图优化.Runtime优化.编译优化以及高性能分布式训练框架,在稀疏模型的训练方面有着优异性能的 ...

  7. 小米手机简单 ROOT教程(百分百成功)

    大家都知道啊,由于小米自带的换机软件不支持一些应用数据的还原,所以需要使用钛备份来还原应用和数据.但是钛备份需要root才能用,因为有些机器刚出没多久,第三方的recovery也没有,所以需要找到一种 ...

  8. C++中 指针的指针是什么?指针的引用又是什么?你可能需要看看这篇文章

    关于变量的定义 我们都知道变量的定义包括一个基本数据类型(base type)和一组声明符,在同一条定义语句中,输入基本数据类型不同,但是声明符的形式却可以不同. //如:i是一个int的整数,a是一 ...

  9. 《图解UE4渲染体系》Part 0 引擎基础

    在介绍UE4渲染体系前,我们有必要来先看一下UE4是用什么样的方式来构建游戏场景数据的. 1 Object 在UE4中当我们说Object,通常是指代引擎代码中的UObject类,它是引擎里管理绝大部 ...

  10. XCTF练习题---MISC---ext3

    XCTF练习题---MISC---ext3 flag:flag{sajbcibzskjjcnbhsbvcjbjszcszbkzj} 解题步骤: 1.下载附件,观察题目,发现题目跟Linux有关,我们换 ...