洛谷 P4169 [Violet]天使玩偶/SJY摆棋子 解题报告
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摆棋子 解题报告的更多相关文章
- 洛谷P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治)
[Violet]天使玩偶/SJY摆棋子 题目传送门 解题思路 用CDQ分治开了氧气跑过. 将输入给的顺序作为第一维的时间,x为第二维,y为第三维.对于距离一个询问(ax,ay),将询问分为四块,左上, ...
- 洛谷P4169 [Violet]天使玩偶/SJY摆棋子
%%%神仙\(SJY\) 题目大意: 一个二维平面,有两种操作: \(1.\)增加一个点\((x,y)\) \(2.\)询问距离\((x,y)\)曼哈顿最近的一个点有多远 \(n,m\le 300 0 ...
- bzoj2716/2648 / P4169 [Violet]天使玩偶/SJY摆棋子
P4169 [Violet]天使玩偶/SJY摆棋子 k-d tree 模板 找了好几天才发现输出优化错了....真是zz...... 当子树非常不平衡时,就用替罪羊树的思想,拍扁重建. luogu有个 ...
- P4169 [Violet]天使玩偶/SJY摆棋子
题目背景 感谢@浮尘ii 提供的一组hack数据 题目描述 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅 ...
- Luogu P4169 [Violet]天使玩偶/SJY摆棋子
传送门 二维平面修改+查询,cdq分治可以解决. 求关于某个点曼哈顿距离(x,y坐标)最近的点——dis(A,B) = |Ax-Bx|+|Ay-By| 但是如何去掉绝对值呢? 查看题解发现假设所有的点 ...
- 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\)一些 就是记一下子树的横.纵坐标最值然后求 ...
- LG4169 [Violet]天使玩偶/SJY摆棋子
题意 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们把 Ayu 生活的小镇 ...
随机推荐
- MySQL☞大结局
emmm,看了这么多大概会用了点点,学到了一点点 select 列名/*/聚合函数 from 表名1 别名1 连接查询(左外.右外等等) 表名2 别名2 on 关联条件 where 查询条件 g ...
- Mysql基础操作语句
SQL 简单的增删改查 不区分大小写, 表名和字段名可不加引号 查询语句 SELECT * FROM `table_name`; -- 注释 CTRL+/ : 注释 CTRL+/ : 取消注释 /* ...
- Linux安装JDK8详细步骤
1.下载jdk8 查看Linux位数,到oracle官网下载对应的jdk ① sudo uname --m 确认32位还是64位 ② https://www.oracle.com/technetwo ...
- K-近邻算法入门
K-近邻算法的直观理解就是:给定一个训练集合,对于新的实例,在训练集合中找到k个与该实例最近的邻居,然后根据“少数服从多数”原则判断该实例归属于哪一类,又称“随大流” K-近邻算法的三大要素:K值得选 ...
- 微软职位内部推荐-Principal Group Program Manager
微软近期Open的职位: Standard job title: Principal Group Program Manager Discipline: Program Management Prod ...
- TCP半开连接与半闭连接
半打开(Half-Open)连接和半关闭(Half-Close)连接.TCP是一个全双工(Full-Duplex)协议,因此这里的半连接"半"字就是相对于全双工的"全&q ...
- 互评Alpha版本——基于spec评论作品
组名:可以低头,但没必要 组长:付佳 组员:张俊余 李文涛 孙赛佳 田良 于洋 刘欣 段晓睿 一.二次元梦之队----I DO 在测评该项目时,我们组索要了该组的apk程序,安装之后我就开 ...
- “Hello World!”团队第十三次会议
今天是我们团队“Hello World!”团队召开的第十三次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 一.会议时间 2 ...
- Android开发设计 实验报告
20162315 Android开发设计 实验报告 实验内容 1.安装 Android Stuidio,完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学 ...
- mysql-otp 驱动中设置utf8mb4
utf8mb4支持emoji表情,在mysql中设置连接字符集为utf8mb4可以直接储存emoji表情. 可以在客户端连接中设置: SET NAMES utf8mb4 查看是否起效: SHOW VA ...