传送门

题意:动态加点,给定点询问曼哈顿距离最近的点

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分治】相关推荐

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

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

  2. [Luogu4169] [Violet]天使玩偶/SJY摆棋子 [cdq分治/k-d tree]

    [Link\frak{Link}Link] 考虑用 cdq 分治解决? 显然依旧分成修改跟查询,考虑一维排序二维cdq?啊但是那显然不太对,cdq能解决三维偏序, 但是她不能解决最近点对啊.平面最近点 ...

  3. 天使玩偶/SJY摆棋子

    P4169 [Violet]天使玩偶/SJY摆棋子 CDQ分治的题目. 我们发现题目要我们求的\(|A_x-B_x|+|A_y-B_y|\)的绝对值号比较恶心. 试想一下怎么去掉 如果所有的点都在我们 ...

  4. [BZOJ2716/2648][Violet 3]天使玩偶/SJY摆棋子[KDtree]

    KDtree干这个复杂度是不对的,重构不一定有作用 解释一下的话,因为复杂度是跟size相关的,所以重构作用不大,KDtree在查询最近点对中的作用仅仅是剪枝,可以构造数据使得他遍历O(n)个节点 h ...

  5. 题解 洛谷 P4169 [Violet]天使玩偶/SJY摆棋子【CDQ分治】

    题目链接 题意:平面上原有一些点,支持动态加点,动态查询与某个点曼哈顿距离最小的点的距离. 这题据说是有 KD-Tree 和 CDQ 分治两种做法,又据说 KDT 会被卡,于是我采用 CDQ (其实是 ...

  6. P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治、暴力)

    解析 之前用KDtree做的一道题 由于懒不想再码一遍了 考虑CDQ分治 关键就是如何拿掉绝对值 如果只维护左下角的,显然就是一个经典的三维偏序问题了 但是本题不一定在左下角,也可能在左上.右下.右上 ...

  7. P4169-[Violet]天使玩偶/SJY摆棋子【CDQ分治】

    正题 题目链接:https://www.luogu.com.cn/problem/P4169 题目大意 nnn个点,然后每次操作 加一个新的点 询问一个点更近的点 解题思路 定义tit_iti​表示第 ...

  8. [Luogu4169][Violet]天使玩偶/SJY摆棋子

    luogu 题意 一个平面上有\(n\)个点,\(m\)次操作,每次新增一个点,或者是询问离某个点最近的点的距离.这里的距离是曼哈顿距离. \(n,m\le3*10^5\) sol 写一发\(CDQ\ ...

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

    传送门 题目大意就是先给定n个点,然后m个操作,每次添加一个点或者查询离一个点最近的一个点是哪个点. 因为要求的是曼哈顿距离,所以我们先把式子转化一下,就是\((x_i + y_i) - (x_j + ...

最新文章

  1. alert在asp.net中如何使用??
  2. html分页自动加载数据库,AngularJS实现分页显示数据库信息
  3. php 4443 端口_Server configuration (Notary)
  4. Cocos2d-x 常见宏
  5. java列出文件正则过滤_JAVA正则表达式过滤文件的实现方法
  6. debian文本配置网络备忘:/etc/network/interfaces
  7. 如何查看一个网站是否部署了SSL证书?
  8. [js] 写一个 document.querySelector 的逆方法
  9. Cannot resolve symbol 'R',Failed to resolve: constraint-layout
  10. [深度学习] tensorflow1.x和tensorflow2.x对比与总结
  11. Deploy Oracle 10.2.0.5 DataGuard on Red Hat Enterprise Linux 6.4
  12. Mycat监控_监控平台安装zookeeper_作为配置中心注册发现用---MyCat分布式数据库集群架构工作笔记0036
  13. 2021-2025年中国电器行业市场供需与战略研究报告
  14. Webpack 简介
  15. mysql菜鸟手迹1--安装及目录介绍
  16. IPMI 1:ipmi简介
  17. C语言实现HDB3编码与译码
  18. 2021年4月2日 星期五 农历二月 阴
  19. 七夕了,男朋友说他想学学算法~
  20. Rosalind全排列的问题

热门文章

  1. 我的电脑不联网,很安全!黑客:你还有风扇呢
  2. 每日一笑 | 老板,黑凤梨真的能吃吗?
  3. 每日一笑 | 为什么英语老师让我们养成背单词的习惯?
  4. 通过R,让你的数据分析更简便!
  5. html表格在页面间距,在CSS中设置单元格和单元格间距?
  6. mybatis 多租户saas_MybatisPlus 多租户架构(SaaS)实现
  7. 不同用户同时并发测压_简单聊聊吞吐量(TPS)、QPS、并发数、响应时间(RT)概念...
  8. python 逆向生成正则表达式_用Python中的正则表达式生成lis
  9. java对象头_我的并发编程(二):java对象头以及synchronized升级过程
  10. 四大金刚 数据结构_GIS技术在气象领域应用综述