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

题目描述

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

我们把 \(Ayu\) 生活的小镇看作一个二维平面坐标系,而 \(Ayu\) 会不定时地记起可能在某个点 \((x,y)\) 埋下了天使玩偶;或者 \(Ayu\) 会询问你,假如她在 \((x,y)\) ,那么她离近的天使玩偶可能埋下的地方有多远。

因为 \(Ayu\) 只会沿着平行坐标轴的方向来行动,所以在这个问题里我们定义两个点之间的距离为\(dist(A,B)=|A_x-B_x|+|A_y-B_y|\)。其中 \(A_x\) 表示点 \(A\) 的横坐标,其余类似。

输入输出格式

输入格式:

第一行包含两个整数\(n\)和\(m\) ,在刚开始时,\(Ayu\) 已经知道有\(n\)个点可能埋着天使玩偶, 接下来 \(Ayu\) 要进行 \(m\) 次操作

接下来\(n\)行,每行两个非负整数 \((x_i,y_i)\),表示初始 \(n\) 个点的坐标。

再接下来 \(m\) 行,每行三个非负整数 \(t,x_i,y_i\)。

如果 \(t=1\) ,则表示 \(Ayu\) 又回忆起了一个可能埋着玩偶的点 \((x_i,y_i)\) 。

如果 \(t=2\) ,则表示 \(Ayu\) 询问如果她在点 \((x_i,y_i)\) ,那么在已经回忆出来的点里,离她近的那个点有多远

输出格式:

对于每个\(t=2\)的询问,在单独的一行内输出该询问的结果。

说明

\(n,m\le 300 000\)

\(x_i,y_i\le 1 000 000\)


明明思路很简单..

最近状态不好啊..

考虑拆掉绝对值,然后我们会多出两个类似于偏序类型的条件,然后配合上时间,就是一个三维偏序问题了。

讨论四次可以转换一下坐标系。

注意位置是0的东西

懒得卡常吸氧气了


Code:

// luogu-judger-enable-o2
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
const int N=6e5+10;
const int M=1e6;
int n,m,k,s[M+10],ans[N];
inline int read()
{
int x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) {x=x*10+c-'0';c=getchar();}
return x;
}
struct node{int op,x,y;}q[N],qs[N],sq[N];
int min(int x,int y){return x<y?x:y;}
void add(int x,int d){while(x<=M)s[x]=s[x]>d?s[x]:d,x+=x&-x;}
void Clear(int x){while(x<=M)s[x]=0,x+=x&-x;}
int ask(int x){int mx=0;while(x)mx=mx>s[x]?mx:s[x],x-=x&-x;return mx==0?-M:mx;}
void CDQ(int l,int r)
{
if(l==r) return;
int mid=l+r>>1;
CDQ(l,mid),CDQ(mid+1,r);
register int lp=l,rp=mid+1,loc=l-1;
while(lp<=mid&&rp<=r)
{
if(q[lp].x<=q[rp].x)
{
if(!q[lp].op) add(q[lp].y,q[lp].x+q[lp].y);
sq[++loc]=q[lp++];
}
else
{
if(q[rp].op) ans[q[rp].op]=min(ans[q[rp].op],q[rp].x+q[rp].y-ask(q[rp].y));
sq[++loc]=q[rp++];
}
}
while(rp<=r)
{
if(q[rp].op) ans[q[rp].op]=min(ans[q[rp].op],q[rp].x+q[rp].y-ask(q[rp].y));
sq[++loc]=q[rp++];
}
for(register int i=l;i<lp;i++) if(!q[i].op) Clear(q[i].y);
while(lp<=mid) sq[++loc]=q[lp++];
for(register int i=l;i<=r;i++) q[i]=sq[i];
}
int main()
{
memset(ans,0x3f,sizeof(ans));
n=read(),m=read();
for(int i=1;i<=n;i++) qs[i].x=read()+1,qs[i].y=read()+1;
for(int i=1;i<=m;i++)
{
qs[i+n].op=read(),qs[i+n].x=read()+1,qs[i+n].y=read()+1;
if(--qs[i+n].op) qs[i+n].op=++k;
}
for(int i=1;i<=n+m;i++)
q[i]=qs[i];
CDQ(1,n+m);
for(int i=1;i<=n+m;i++)
q[i]={qs[i].op,M-qs[i].x,qs[i].y};
CDQ(1,n+m);
for(int i=1;i<=n+m;i++)
q[i]={qs[i].op,qs[i].x,M-qs[i].y};
CDQ(1,n+m);
for(int i=1;i<=n+m;i++)
q[i]={qs[i].op,M-qs[i].x,M-qs[i].y};
CDQ(1,n+m);
for(int i=1;i<=k;i++) printf("%d\n",ans[i]);
return 0;
}

2018.11.28

洛谷 P4169 [Violet]天使玩偶/SJY摆棋子 解题报告的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. docker简单使用+django+uwsgi+nginx项目部署

    使用docker 搭建 centos7 环境: 主机环境:windows 10专业版 一.安装docker Hub.docker.com官网下载 docker for windows 安装完成后,任务 ...

  2. 【bzm-Random CSV Data Set Config】 -jmeter - 文件中随机取参的方法,(插件自带)

    文件中随机取参数的方法  Random CSV Data Set Config

  3. K8S-RedisCluster搭建

    简介         Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接, mastart节点之间存放的数据并不是相同的,只是其中的一部分,当我们请 ...

  4. Sublime Text 2 - Unable to find git.exe 错误

    今日打开 Sublime Text 2,随即弹出 Package Control - Unable to find git.exe 错误.如下, 原因:曾经通过 git clone 命令获取过 Sub ...

  5. 6. B树

    一.B 树是一种多叉平衡查找树 相较于二叉结构的红黑树,B 树是多叉结构,所以在元素数量非常多的情况下,B 树的高度不会像二叉树那么大,从而保证查询效率. 一棵含 n 个结点的 B 树的高度 h = ...

  6. USACO 2.3.4 Money Systems 货币系统(完全背包)

    Description 母牛们不但创建了他们自己的政府而且选择了建立了自己的货币系统. [In their own rebellious way],,他们对货币的数值感到好奇. 传统地,一个货币系统是 ...

  7. Android 中调用本地命令

    Android 中调用本地命令 通常来说,在 Android 中调用本地的命令的话,一般有以下 3 种情况: 调用下也就得了,不管输出的信息,比如:echo Hello World.通常来说,这种命令 ...

  8. sysbench 环境安装,压测mysql

    源码路径:https://github.com/akopytov/sysbench 版本linux 6.8sysbench 0.5mysql 5.6.29 1.安装pip略 2.pip 安装bzr p ...

  9. p2 入门

    心里一片空白,要弄个p2的demo出来... 先了解下p2的概念吧 P2只是一个算法库,以刚体为对象模型,模拟并输出物理碰撞.运动结果.这个过程通过持续调用world中的step()方法来实现 p2的 ...

  10. Tomcat安装及配置详解

    Tomcat安装及配置详解   一,Tomcat简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,Tomcat是Apache 软件基金会(Apache Software Found ...