浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html
题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=4605

在写此题之余,我在某东上买了一箱\(24\)瓶装的崂山白花蛇草水,喝完就再续,准备一直喝到省选结束\(emm\)。

这题用权值线段树套\(kd\) \(tree\)即可轻松解决。不过需要用到类似于替罪羊树的重建。

另外可以加一个小优化,那就是只给线段树的右儿子建\(kd\) \(tree\),因为对\(kd\) \(tree\)进行访问也只会发生在右儿子上。

时间复杂度:\(O(nlognlog10^9+nlog10^9\sqrt{n})\)

空间复杂度:\(O(nlogn+nlog10^9)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;
#define bo11 (X2<p[u].mn[0]||p[u].mx[0]<X1)
#define bo12 (Y2<p[u].mn[1]||p[u].mx[1]<Y1)
#define bo21 (X1<=p[u].mn[0]&&p[u].mx[0]<=X2)
#define bo22 (Y1<=p[u].mn[1]&&p[u].mx[1]<=Y2)
#define bo31 (X1<=p[u].c[0]&&p[u].c[0]<=X2)
#define bo32 (Y1<=p[u].c[1]&&p[u].c[1]<=Y2)const double alpha=0.75;
const int maxn=1e5+5,inf=2e9;int n,m,ans,k,X1,Y1,X2,Y2,cnt,pps;int read() {int x=0,f=1;char ch=getchar();for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';return x*f;
}struct kd_tree {int tot,top;int id[maxn];struct point {int ls,rs,siz;int c[2],mn[2],mx[2];bool operator<(const point &a)const {return c[pps]<a.c[pps];}}p[maxn*20],tmp[maxn];void update(int u) {int ls=p[u].ls,rs=p[u].rs;p[u].siz=p[ls].siz+1+p[rs].siz;for(int i=0;i<2;i++) {int mn=min(p[ls].mn[i],p[rs].mn[i]);p[u].mn[i]=min(p[u].c[i],mn);int mx=max(p[ls].mx[i],p[rs].mx[i]);p[u].mx[i]=max(p[u].c[i],mx);}}void ins(int &u,int d) {if(!u) {u=++tot;p[u].c[0]=p[u].mn[0]=p[u].mx[0]=X1;p[u].c[1]=p[u].mn[1]=p[u].mx[1]=Y1;p[u].siz=1,p[u].ls=p[u].rs=0;return;}int num=d?Y1:X1;if(num<p[u].c[d])ins(p[u].ls,d^1);else ins(p[u].rs,d^1);update(u);}int rebuild(int l,int r,int d) {int mid=(l+r)>>1,u=id[mid];pps=d;nth_element(tmp+l,tmp+mid,tmp+r+1);p[u]=tmp[mid];if(l<mid)p[u].ls=rebuild(l,mid-1,d^1);if(r>mid)p[u].rs=rebuild(mid+1,r,d^1);update(u);return u;}void recycle(int u) {id[++top]=u;int ls=p[u].ls,rs=p[u].rs;p[u].mn[0]=p[u].mn[1]=inf;p[u].mx[0]=p[u].mx[1]=-inf;p[u].siz=1,p[u].ls=p[u].rs=0;tmp[top]=p[u];if(ls)recycle(ls);if(rs)recycle(rs);}void check(int &u,int d) {if(!u)return;int ls=p[u].ls,rs=p[u].rs;if(max(p[ls].siz,p[rs].siz)>alpha*p[u].siz) {top=0,recycle(u),u=rebuild(1,top,0);return;}int num=d?Y1:X1;if(num<p[u].c[d])check(p[u].ls,d^1);else check(p[u].rs,d^1);}void query(int u) {if(bo11||bo12)return;if(bo21&&bo22) {cnt+=p[u].siz;return;}if(bo31&&bo32) cnt++;if(p[u].ls)query(p[u].ls);if(p[u].rs)query(p[u].rs);}
}kd;struct segment_tree {int tot;int ls[maxn*20],rs[maxn*20],rt[maxn*20];void ins() {int l=1,r=1e9,p=1,bo=1;while(1) {if(bo)kd.ins(rt[p],0),kd.check(rt[p],0);if(l==r)break;int mid=(l+r)>>1;if(k<=mid) {if(!ls[p])ls[p]=++tot;r=mid,p=ls[p],bo=0;}else {if(!rs[p])rs[p]=++tot;l=mid+1,p=rs[p],bo=1;}}}void query() {cnt=0;kd.query(rt[1]);if(cnt<k) {puts("NAIVE!ORZzyz.");ans=0;return;}int l=1,r=1e9,p=1;while(1) {if(l==r)break;int mid=(l+r)>>1;cnt=0;kd.query(rt[rs[p]]);if(cnt>=k)l=mid+1,p=rs[p];else r=mid,p=ls[p],k-=cnt;}ans=l;printf("%d\n",ans);}
}T;int main() {n=read(),m=read();T.tot=1;kd.p[0].mn[0]=kd.p[0].mn[1]=inf;kd.p[0].mx[0]=kd.p[0].mx[1]=-inf;while(m--) {int opt=read();X1=read()^ans,Y1=read()^ans;if(opt==1)k=read()^ans,T.ins();else {X2=read()^ans,Y2=read()^ans,k=read()^ans;T.query();}}return 0;
}

转载于:https://www.cnblogs.com/AKMer/p/10411032.html

BZOJ4605:崂山白花蛇草水相关推荐

  1. bzoj4605: 崂山白花蛇草水 权值线段树套KDtree

    bzoj4605: 崂山白花蛇草水 链接 bzoj loj 思路 强制在线,那就权值线段树套KDtree好了,没啥好讲的. KDtree要加平衡因子来重构.另外,那水真难喝. 错误 树套树一边写过了, ...

  2. bzoj4605: 崂山白花蛇草水 //替罪羊式重构k-d树

    bzoj4605: 崂山白花蛇草水 题意 Q(<=100000)次操作,支持: 在二维平面上插入一个坐标(x,y)(x,y<=500000),点权为v(<=1e9)的点: 查询矩形区 ...

  3. [bzoj4605]崂山白花蛇草水 k-d tree 带替罪羊重构

    4605: 崂山白花蛇草水 Time Limit: 80 Sec  Memory Limit: 512 MB [Submit][Status][Discuss] Description 神犇Aleph ...

  4. 【线段树套KD树】[BZOJ4605]崂山白花蛇草水

    题目描述 Description 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实 力,他轻松地进了山东省省队,现在便是他履 ...

  5. bzoj4605 崂山白花蛇草水

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4605 [题解] 序列上的第k大我们可以用线段树内套一个能查询序列某些地方有多少数的数据结构来 ...

  6. bzoj4605 崂山白花蛇草水 权值线段树套kd树

    Description Q次操作,要求资瓷 在(x,y)处放一个数字x 查询(x1,y1)到(x2,y2)矩形内第k大 Solution 非常裸的权值线段树套kd树,为了保证复杂度可以定期重构也可以平 ...

  7. BZOJ4605 : 崂山白花蛇草水

    外层维护权值线段树,内层维护kd-tree. 修改的时候只往右儿子里插入,不平衡的时候替罪羊式重构. 查询的时候在外层线段树上走,在内层kd-tree上查询矩形内点数即可. 时间复杂度$O(q\log ...

  8. bzoj4605 崂山白花蛇草水(动态开点线段树逃替罪羊重构K-D tree)

    首先我们发现它是一个三维的问题而且还强制在线 囧 我们可以考虑在外面来一个权值线段树,然后每次查询时在线段树二分即可,这样我们每个节点再套一棵K-D tree,用来查询有多少个点被框住了,然后因为是不 ...

  9. bzoj4605: 崂山白花蛇草水(权值线段树套k-dtree)

    题目 #include<bits/stdc++.h> using namespace std; #define mid (l+r>>1) const int N=100002, ...

  10. [BZOJ4605]崂山白花蛇草水(主席树套kd-tree)

    题意:两种操作,在二维平面插入一个点及其权值,查询矩形区间第k大,强制在线. 之前考试考过一个矩形区间第k大的题..当时想了各种树套树套树,算了算复杂度都没有暴力快..后来憋了个kd-tree套主席树 ...

最新文章

  1. DB天气app冲刺二阶段第十一天(完结)
  2. (30个原生js挑战)原生js实现钟表
  3. 怎样让elementui表格里面的文字不换行,溢出隐藏,tooltip显示内容
  4. 将代码从windows移动linux上出现^M错误的解决方法
  5. windows。forms.timer设置第一次不等待_防火卷帘设置的场景不同下降的要求有哪些区别?...
  6. Matplotlib画图常用方法总结(全)
  7. 速达服务器账套定期维护么,速达软件常见操作问题解决方法
  8. Java 算法 区间K大数查询
  9. Traditional industries like notebook computers seem
  10. 喜欢就争取,得到就珍惜,错过就忘记—dbGet(二)
  11. php 405,http 405错误是什么 http 405错误怎么解决
  12. 手把手教你搭建免费云平台——新浪云
  13. 离散化-利用计算机求解y=x,离散信号处理(双语)-中国大学mooc-题库零氪
  14. 小程序---验证input输入不能为空
  15. extension(类扩展)和 category(类别)
  16. 32岁的程序员被裁,java宿舍管理系统源码jsp
  17. 台式电脑怎么添加计算机硬盘,台式机如何添加硬盘|台式机添加硬盘的方法
  18. jquery 弹出对话框
  19. pytdx 获取板块指数_通达信如何查看行业板块和概念板块的指数和K线图
  20. 每周教育关注 | 新时代的教育评价改革

热门文章

  1. 【Vue】Vue移动端页面自适应解决方案
  2. 金融行业开源软件研究评测报告——JSON组件
  3. CCIE重认证--350-401-补充题库-也是必须的哟
  4. 基于微信小程序的面包店在线服务系统
  5. POJ 2942 Knights of the Round Table (奇圈+点双联通)
  6. 基于SSM框架的OA办公系统
  7. 阿里云服务器实时计算Flink/Blink首选大数据型d2c、d2s实例
  8. 沧小海基于xilinx srio核的学习笔记之第二章 Rapidio技术概述
  9. 1056: 幸运数字 Java
  10. CSS里面的长度单位px/pt/em/in/pc/mm/cm解释