• 两种操作: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. python爬虫---污言污语网站数据采集

    代码: import requests from lxml import etree headers = { "user-agent": "Mozilla/5.0 (Wi ...

  2. Python使用逻辑回归估算OR值

    第一种是统计学方法,需要用到 statsmodels包 statsmodels是统计和计量经济学的package,包含了用于参数评估和统计测试的实用工具 第二种是机器学习,需要使用sklearn中的L ...

  3. 利用window对象自带atob和btoa方法进行base64的编码和解码

    项目中一般需要将表单中的数据进行编码之后再进行传输到服务器,这个时候就需要base64编码 现在可以使用window自带的方法window.atob() 和  window.btoa()  方法进行 ...

  4. PyQt5 基本语法(五)

    目录 2. 输入控件(二) 2.2 步长调节 2.2.1 QAbstractSpinBox 2.2.1.1 描述 2.2.1.2 功能作用 2.2.1.2.1 使用 2.2.1.2.2 主要功能 2. ...

  5. PostgreSQL安装 报there has been an error.Error running

    直接用postgresql-11.2-1:https://get.enterprisedb.com/postgresql/postgresql-11.2-1-windows-x64.exe这个版本的安 ...

  6. GO语言学习——基本数据类型——整型、浮点型、复数、布尔值、fmt占位符

    基本数据类型 整型 整型分为以下两个大类: 按长度分为:int8.int16.int32.int64 对应的无符号整型:uint8.uint16.uint32.uint64 其中,uint8就是我们熟 ...

  7. SimpleDateFormat类的安全问题,这6个方案总有一个适合你

    摘要:你使用的SimpleDateFormat类还安全吗?为什么说SimpleDateFormat类不是线程安全的?带着问题从本文中寻求答案. 本文分享自华为云社区<[高并发]SimpleDat ...

  8. angular.js中指令compile与link原理剖析

    在angularJs应用启动之前,它们是以HTML文本形式存在文本编辑器当中.应用启动会进行编译和链接,作用域会同HTML进行绑定.这个过程包含了两个阶段! 编译阶段 在编译的阶段,angularJs ...

  9. 使用 VS Code 撰写 Markdown 文档

    众所周知, VS Code 是微软和社区一起开发的一款很优秀的高级代码编辑器.它不仅可以写出一手好代码,还能写出一篇好文章.利用 Markdown 就可以写出一篇排版美观的技术文章了. 而 Markd ...

  10. UnrealEngine创建自定义资产类型

    导语 这篇文章记录了将UObject实例保存在Asset文件的方法,用这个方法可以将自定义的UObject数据序列化保存到文件,可以用于自定义UE资源类型. 创建UObject类 这一步比较简单,按照 ...