正题

题目链接:https://www.luogu.com.cn/problem/P4169


题目大意

nnn个点,然后每次操作

  1. 加一个新的点
  2. 询问一个点更近的点

解题思路

定义tit_iti​表示第几个操作,开始就有的点tit_iti​为000
假设最近的点在左上角,那么有要求ti<tj,xi<xj,yi<yjt_i<t_j,x_i<x_j,y_i<y_jti​<tj​,xi​<xj​,yi​<yj​构成了一个三维偏序。
对于一个点对(i,j)(i,j)(i,j),权值是xi−xj+yi−yj⇒xi+yi−(xj+yj)x_i-x_j+y_i-y_j\Rightarrow x_i+y_i-(x_j+y_j)xi​−xj​+yi​−yj​⇒xi​+yi​−(xj​+yj​)。用树状数组维护xi+yix_i+y_ixi​+yi​的前缀maxmaxmax即可

然后旋转一下坐标就行了,时间复杂度O(nlog⁡2n)O(n\log^2n)O(nlog2n)


codecodecode

/*#pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#define lowbit(x) (x&-x)
using namespace std;
const int N=6e5+10,K=1e6+1;
struct node{int x,y,id,t;
}a[N],b[N];
int n,m,tot,cnt,t[K+10],ans[N];
int read() {int x=0,f=1; char c=getchar();while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();return x*f;
}
void print(int x){if (x>9) print(x/10); putchar(x%10+48); return;
}
void Change(int x,int val){x++;while(x<=K){t[x]=max(t[x],val);x+=lowbit(x);}return;
}
void Clear(int x){x++;while(x<=K){t[x]=-1e7;x+=lowbit(x);} return;
}
int Ask(int x){ int ans=-1e7;x++;while(x){ans=max(ans,t[x]);x-=lowbit(x);}return ans;
}
bool cmp(node x,node y)
{return x.t<y.t;}
void merge(int l,int mid,int r){int L=l,R=mid+1,z=l;while(z<=r){if((a[L].x<=a[R].x||R>r)&&L<=mid)b[z++]=a[L++];else if(a[L].x>a[R].x||L>mid)b[z++]=a[R++];}for(int i=l;i<=r;i++)a[i]=b[i];return;
}
void cdq(int l,int r){if(l==r)return;int mid=(l+r)>>1;cdq(l,mid);cdq(mid+1,r);int z=l;for(int i=mid+1;i<=r;i++){while(z<=mid&&a[z].x<=a[i].x){if(a[z].id==0)Change(a[z].y,a[z].x+a[z].y);z++;}if(a[i].id!=0)ans[a[i].id]=min(ans[a[i].id],a[i].x+a[i].y-Ask(a[i].y));}for(int i=l;i<z;i++)Clear(a[i].y);merge(l,mid,r);return;
}
int main()
{n=read();m=read(); for(int i=1;i<=n;i++){a[i].x=read()+1;a[i].y=read();a[i].t=i;}for(int i=1;i<=m;i++){int op=read();a[++n].t=n;a[n].x=read()+1;a[n].y=read(); if(op==2)a[n].id=++cnt;}sort(a+1,a+1+n,cmp);memset(t,0xcf,sizeof(t));memset(ans,0x3f,sizeof(ans));cdq(1,n);for(int i=1;i<=n;i++)a[i].x=K-a[i].x;sort(a+1,a+1+n,cmp);cdq(1,n);for(int i=1;i<=n;i++)a[i].y=K-a[i].y;sort(a+1,a+1+n,cmp);cdq(1,n);for(int i=1;i<=n;i++)a[i].x=K-a[i].x;sort(a+1,a+1+n,cmp);cdq(1,n);for(int i=1;i<=cnt;i++)print(ans[i]),putchar('\n');
}

P4169-[Violet]天使玩偶/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. P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治、暴力)

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

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

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

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

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

  6. 【洛谷P4169】天使玩偶/SJY摆棋子【CDQ分治】

    传送门 题意:动态加点,给定点询问曼哈顿距离最近的点 N,M≤3e5,x,y≤1e6N,M \leq 3e5,x,y \leq 1e6N,M≤3e5,x,y≤1e6 经(kan)过(le)分(ti)析 ...

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

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

  8. 天使玩偶/SJY摆棋子

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

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

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

最新文章

  1. 对数据库表中的某一字段去重分组排序
  2. Struts2拦截器属性excludeMethods、includeMethods配置无效之解决方法
  3. Daily Scrum 10.24
  4. [转载]Java-集合框架完全解析
  5. 【VMware虚拟化解决方案】双网隔离虚拟化桌面解决方案
  6. 微信lbs开发 php,【LBS】基于地理位置的搜索之微信 附近的人 简单实现
  7. 稳健估计/M估计/最小二乘法
  8. 今夜,昆山请将我遗忘 2009-01-06 01:59
  9. oracle表中一个字段内容导出到磁盘上
  10. css如何让两个div上下排列_CSS层叠上下文
  11. springboot开篇 (一)简单邮件发送
  12. 2018, CHI CHI2016汇总all CHI
  13. 氚云SaaS介绍文档
  14. Win10此设备不支持接收 Miracast 无法投影的解决方法
  15. 我分析了100篇文章,总结出5点头条号推荐机制真相
  16. 【IoT】内容运营 | 获得更多评论的 8 种策略
  17. visitor模式入门
  18. 拒绝一心多用的工作学习方式(转)
  19. 访问windows azure虚拟机iis服务器,Azure使用文件共享从IIS虚拟机共享照片?
  20. 前端最有成就感一—-封装

热门文章

  1. 下列选项中 采用边界值平滑_数据挖掘期末考题(答案).doc
  2. python中的成员运算符是干嘛的_在Python中使用成员运算符的示例
  3. mysql 碎片率_MySQL数据碎片的整理和分析
  4. python编写程序计算1+2+3+......+100和_Python3:计算两个列表总和为100的所有排列的最有效方法是什么?...
  5. android中的帧动画,[Android开发] Android中的帧动画
  6. 数据结构——从叶子结点到根节点的全部路径
  7. array remove java_how to remove array from another array in javascript
  8. 《C++ Primer》7.4节练习
  9. 《C++ Primer》1.52节练习
  10. 非递归遍历二叉树(算法导论第三版第十章10.4-5)