P4169 [Violet]天使玩偶
两种操作: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]天使玩偶的更多相关文章
- bzoj2716/2648 / P4169 [Violet]天使玩偶/SJY摆棋子
P4169 [Violet]天使玩偶/SJY摆棋子 k-d tree 模板 找了好几天才发现输出优化错了....真是zz...... 当子树非常不平衡时,就用替罪羊树的思想,拍扁重建. luogu有个 ...
- 洛谷 P4169 [Violet]天使玩偶/SJY摆棋子 解题报告
P4169 [Violet]天使玩偶/SJY摆棋子 题目描述 \(Ayu\)在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,\(Ayu\) 却忘了她把天使玩偶埋在了哪 ...
- 洛谷P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治)
[Violet]天使玩偶/SJY摆棋子 题目传送门 解题思路 用CDQ分治开了氧气跑过. 将输入给的顺序作为第一维的时间,x为第二维,y为第三维.对于距离一个询问(ax,ay),将询问分为四块,左上, ...
- P4169 [Violet]天使玩偶/SJY摆棋子
题目背景 感谢@浮尘ii 提供的一组hack数据 题目描述 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅 ...
- Luogu P4169 [Violet]天使玩偶/SJY摆棋子
传送门 二维平面修改+查询,cdq分治可以解决. 求关于某个点曼哈顿距离(x,y坐标)最近的点——dis(A,B) = |Ax-Bx|+|Ay-By| 但是如何去掉绝对值呢? 查看题解发现假设所有的点 ...
- 洛谷P4169 [Violet]天使玩偶/SJY摆棋子
%%%神仙\(SJY\) 题目大意: 一个二维平面,有两种操作: \(1.\)增加一个点\((x,y)\) \(2.\)询问距离\((x,y)\)曼哈顿最近的一个点有多远 \(n,m\le 300 0 ...
- luoguP4169 [Violet]天使玩偶/SJY摆棋子 K-Dtree
P4169 [Violet]天使玩偶/SJY摆棋子 链接 luogu 思路 luogu以前用CDQ一直过不去. bzoj还是卡时过去的. 今天终于用k-dtree给过了. 代码 #include &l ...
- [Violet]天使玩偶/SJY摆棋子 [cdq分治]
P4169 [Violet]天使玩偶/SJY摆棋子 求离 \((x,y)\) 最近点的距离 距离的定义是 \(|x1-x2|+|y1-y2|\) 直接cdq 4次 考虑左上右上左下右下就可以了-略微卡 ...
- 【LG4169】[Violet]天使玩偶/SJY摆棋子
[LG4169][Violet]天使玩偶/SJY摆棋子 题面 洛谷 题解 至于\(cdq\)分治的解法,以前写过 \(kdTree\)的解法好像还\(sb\)一些 就是记一下子树的横.纵坐标最值然后求 ...
随机推荐
- 深入理解ES6之《用模块封装代码》
什么是模块 模块是自动运行在严格模式下并且没有办法退出运行的Javascript代码 在模块的顶部this的值是undefined 其模块不支持html风格的代码注释除非用default关键字,否则不 ...
- WebGL2系列之顶点数组对象
使用了顶点缓冲技术后,绘制效率有了较大的提升.但是还有一点不尽如人意,那就是顶点的位置坐标.法向量.纹理坐标等不同方面的数据每次使用时需要单独指定,重复了一些不必要的工作.WebGL2提供了一种专门用 ...
- [翻译]Service workers:PWA背后的英雄
原文地址:https://medium.freecodecamp.org/service-workers-the-little-heroes-behind-progressive-web-apps-4 ...
- webstrom Debug 调试vue项目
第一种,使用vue插件 下载插件:https://chrome.google.com/web... 这样直接run一个vue项目,你就会看见插件标亮了 打开调试模式,你就会看见最后有个vue标记,打开 ...
- x64 番外篇——保护模式相关
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- python-计算素数和
本题要求计算输入两个正整数x,y(x<=y,包括x,y)素数和.函数isPrime用以判断一个数是否素数,primeSum函数返回素数和. 输入格式: 输入两个整数. 输出格式: [m-n]间的 ...
- AS之去掉顶部标题栏
在该目录下,将原本<style name的这行代码改为: <style name="Theme.Tongxunlu" parent="Theme.Materi ...
- CSS简单样式练习(三)
运行效果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...
- vue行内动态添加样式或者动态添加类名
还是记录一下吧(๑•ᴗ•๑) <li :style="{backgroundImage:`url(${item.pic})`}" @click="chooseVip ...
- Taro下拉刷新,上拉加载更多
1.引入插件 import Taro, { Component } from '@tarojs/taro' import { View, Text, ScrollView } from '@taroj ...