【洛谷P4169】天使玩偶/SJY摆棋子【CDQ分治】
传送门
题意:动态加点,给定点询问曼哈顿距离最近的点
N,M≤3e5,x,y≤1e6N,M \leq 3e5,x,y \leq 1e6N,M≤3e5,x,y≤1e6
经(kan)过(le)分(ti)析(jie),这是一道cdqcdqcdq分治
考虑当前区间左半边修改对右半边的询问的影响
设左边某个修改为(x1,y1)(x_1,y_1)(x1,y1),右边的某个询问为(x2,y2)(x_2,y_2)(x2,y2)
考虑x1≤x2,y1≤y2x_1 \leq x_2,y_1 \leq y_2x1≤x2,y1≤y2的情况,答案为x2+y2−x1−y1x_2+y_2-x_1-y_1x2+y2−x1−y1
因为坐标是线性级别,所以需要排序搞掉一维
左右分别以xxx坐标排序
这样可以用双指针搞掉xxx的限制
yyy坐标开个树状数组,记录不超过yyy的修改中最大的x+yx+yx+y
然后很容易计算答案
其他三种情况类似
为了实现方便,直接旋转坐标系,即用infinfinf减
树状数组已经有了logloglog,我们已经无所畏惧,所以可以直接sortsortsort
复杂度O(NlogN2)O(Nlog_N^2)O(NlogN2)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
#define MAXN 600005
#define MAXM 2000005
#define MAX 1000000
using namespace std;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
int n,m,siz;
struct BIT
{int s[MAXM];inline int lowbit(const int& x){return x&-x;}inline void modify(int x,const int& v){for (;x<=(MAX<<1);s[x]=max(s[x],v),x+=lowbit(x));}inline int query(int x){int ans=-0x3f3f3f3f;for (;x;ans=max(ans,s[x]),x-=lowbit(x));return ans;}inline void clear(int x){for (;x<=(MAX<<1);s[x]=-0x3f3f3f3f,x+=lowbit(x));}
}bit;
int ans[MAXN];
struct query{int type,x,y,pos;}q[MAXN];
inline bool operator <(const query& a,const query& b){if (a.x==b.x) return a.y<b.y;return a.x<b.x;}
void calc(int l,int r)
{int now=l-1,mid=(l+r)>>1;for (int i=mid+1;i<=r;i++){if (q[i].type==1) continue;while (now<mid&&q[now+1].x<=q[i].x) {++now;if (q[now].type==1) bit.modify(q[now].y,q[now].x+q[now].y);}ans[q[i].pos]=min(ans[q[i].pos],q[i].x+q[i].y-bit.query(q[i].y));}for (int i=l;i<=mid;i++) bit.clear(q[i].y);
}
void cdq(int l,int r)
{if (l==r) return;int mid=(l+r)>>1;cdq(l,mid);cdq(mid+1,r);calc(l,r);for (int i=l;i<=r;i++) q[i].x=MAX-q[i].x;sort(q+l,q+mid+1),sort(q+mid+1,q+r+1);calc(l,r);for (int i=l;i<=r;i++) q[i].y=MAX-q[i].y;sort(q+l,q+mid+1),sort(q+mid+1,q+r+1);calc(l,r);for (int i=l;i<=r;i++) q[i].x=MAX-q[i].x;sort(q+l,q+mid+1),sort(q+mid+1,q+r+1);calc(l,r);for (int i=l;i<=r;i++) q[i].y=MAX-q[i].y;sort(q+l,q+r+1);
}
int main()
{n=read(),m=read();for (int i=1;i<=n;i++) q[i].type=1,q[i].x=read()+1,q[i].y=read()+1;for (int i=1;i<=m;i++) q[n+i].type=read(),q[n+i].x=read()+1,q[n+i].y=read()+1,q[n+i].pos=i;memset(ans,0x3f,sizeof(ans));for (int i=0;i<MAXM;i++) bit.s[i]=-0x3f3f3f3f;cdq(1,n+m);for (int i=1;i<=m;i++)if (ans[i]<0x3f3f3f3f)printf("%d\n",ans[i]);return 0;
}
【洛谷P4169】天使玩偶/SJY摆棋子【CDQ分治】相关推荐
- P4169 [Violet]天使玩偶/SJY摆棋子 [CDQ分治]
天使玩偶天使玩偶天使玩偶 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们把 ...
- [Luogu4169] [Violet]天使玩偶/SJY摆棋子 [cdq分治/k-d tree]
[Link\frak{Link}Link] 考虑用 cdq 分治解决? 显然依旧分成修改跟查询,考虑一维排序二维cdq?啊但是那显然不太对,cdq能解决三维偏序, 但是她不能解决最近点对啊.平面最近点 ...
- 天使玩偶/SJY摆棋子
P4169 [Violet]天使玩偶/SJY摆棋子 CDQ分治的题目. 我们发现题目要我们求的\(|A_x-B_x|+|A_y-B_y|\)的绝对值号比较恶心. 试想一下怎么去掉 如果所有的点都在我们 ...
- [BZOJ2716/2648][Violet 3]天使玩偶/SJY摆棋子[KDtree]
KDtree干这个复杂度是不对的,重构不一定有作用 解释一下的话,因为复杂度是跟size相关的,所以重构作用不大,KDtree在查询最近点对中的作用仅仅是剪枝,可以构造数据使得他遍历O(n)个节点 h ...
- 题解 洛谷 P4169 [Violet]天使玩偶/SJY摆棋子【CDQ分治】
题目链接 题意:平面上原有一些点,支持动态加点,动态查询与某个点曼哈顿距离最小的点的距离. 这题据说是有 KD-Tree 和 CDQ 分治两种做法,又据说 KDT 会被卡,于是我采用 CDQ (其实是 ...
- P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治、暴力)
解析 之前用KDtree做的一道题 由于懒不想再码一遍了 考虑CDQ分治 关键就是如何拿掉绝对值 如果只维护左下角的,显然就是一个经典的三维偏序问题了 但是本题不一定在左下角,也可能在左上.右下.右上 ...
- P4169-[Violet]天使玩偶/SJY摆棋子【CDQ分治】
正题 题目链接:https://www.luogu.com.cn/problem/P4169 题目大意 nnn个点,然后每次操作 加一个新的点 询问一个点更近的点 解题思路 定义tit_iti表示第 ...
- [Luogu4169][Violet]天使玩偶/SJY摆棋子
luogu 题意 一个平面上有\(n\)个点,\(m\)次操作,每次新增一个点,或者是询问离某个点最近的点的距离.这里的距离是曼哈顿距离. \(n,m\le3*10^5\) sol 写一发\(CDQ\ ...
- [Violet]天使玩偶/SJY摆棋子
传送门 题目大意就是先给定n个点,然后m个操作,每次添加一个点或者查询离一个点最近的一个点是哪个点. 因为要求的是曼哈顿距离,所以我们先把式子转化一下,就是\((x_i + y_i) - (x_j + ...
最新文章
- alert在asp.net中如何使用??
- html分页自动加载数据库,AngularJS实现分页显示数据库信息
- php 4443 端口_Server configuration (Notary)
- Cocos2d-x 常见宏
- java列出文件正则过滤_JAVA正则表达式过滤文件的实现方法
- debian文本配置网络备忘:/etc/network/interfaces
- 如何查看一个网站是否部署了SSL证书?
- [js] 写一个 document.querySelector 的逆方法
- Cannot resolve symbol 'R',Failed to resolve: constraint-layout
- [深度学习] tensorflow1.x和tensorflow2.x对比与总结
- Deploy Oracle 10.2.0.5 DataGuard on Red Hat Enterprise Linux 6.4
- Mycat监控_监控平台安装zookeeper_作为配置中心注册发现用---MyCat分布式数据库集群架构工作笔记0036
- 2021-2025年中国电器行业市场供需与战略研究报告
- Webpack 简介
- mysql菜鸟手迹1--安装及目录介绍
- IPMI 1:ipmi简介
- C语言实现HDB3编码与译码
- 2021年4月2日 星期五 农历二月 阴
- 七夕了,男朋友说他想学学算法~
- Rosalind全排列的问题
热门文章
- 我的电脑不联网,很安全!黑客:你还有风扇呢
- 每日一笑 | 老板,黑凤梨真的能吃吗?
- 每日一笑 | 为什么英语老师让我们养成背单词的习惯?
- 通过R,让你的数据分析更简便!
- html表格在页面间距,在CSS中设置单元格和单元格间距?
- mybatis 多租户saas_MybatisPlus 多租户架构(SaaS)实现
- 不同用户同时并发测压_简单聊聊吞吐量(TPS)、QPS、并发数、响应时间(RT)概念...
- python 逆向生成正则表达式_用Python中的正则表达式生成lis
- java对象头_我的并发编程(二):java对象头以及synchronized升级过程
- 四大金刚 数据结构_GIS技术在气象领域应用综述