其实只是放个代码,会K-D-Tree的同学看了就知道怎么rebuild了,其实也是很简单粗暴的……

单独再发一次吧,感觉把代码跟之前的一起发不知道啥时候就找不到了……

 #include<bits/stdc++.h>
#define N 50010
#define inf 1000000009
#define lson (t1[o].l)
#define rson (t1[o].r)
using namespace std;
typedef long long ll;
int n,m,q[N],rt,dis,top=;int tot=,F;
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}int ans=;
struct Point{
int d[],maxv[],minv[],l,r,f,size,v,ma;
inline int& operator [] (int x){return d[x];}
inline int in(){for(int i=;i<;i++)d[i]=read();}
}t1[N],t2[N],it;
bool cmp(int a,int b){return t1[a][F]<t2[b][F];}
bool operator < (Point a,Point b){
for(int i=;i<=;i++){
if(a.d[i]<b.d[i])return ;
if(a.d[i]>b.d[i])return ;
}
return ;
}
inline void pushup(int o){
for(int i=;i<=;i++){
t1[o].minv[i]=min(t1[o].d[i],min(t1[lson].minv[i],t1[rson].minv[i]));
t1[o].maxv[i]=max(t1[o].d[i],max(t1[lson].maxv[i],t1[rson].maxv[i]));
}
t1[o].ma=max(t1[o].v,max(t1[lson].ma,t1[rson].ma));
t1[o].size=t1[lson].size+t1[rson].size+;
}
int build(int l,int r,int f){
int mid=(l+r)>>;F=f;
nth_element(q+l,q+mid,q+r+,cmp);
int o=q[mid];t1[o].f=f;lson=;rson=;
if(l<mid)lson=build(l,mid-,(f+)%);
if(r>mid)rson=build(mid+,r,(f+)%);
pushup(o);return o;
}
void dfs(int o){
if(!o)return;q[++top]=o;
dfs(lson);dfs(rson);
}
void rebuild(int &o){
top=;dfs(o);
o=build(,top,t1[o].f);
}
inline int newnode(int f){
int o=++tot;t1[tot].f=f;t1[o]=it;
for(int i=;i<=;i++)t1[o].minv[i]=t1[o].maxv[i]=t1[o][i];
t1[o].ma=t1[o].v;t1[o].size=;
return o;
}
void ins(int &o,int f){
if(!o){o=newnode(f);return;}
if(t1[o][f]<it[f]){
ins(lson,(f+)%);
pushup(o);
if(t1[lson].size>t1[o].size*0.75)rebuild(o);
}
else{
ins(rson,(f+)%);
pushup(o);
if(t1[rson].size>t1[o].size*0.75)rebuild(o);
}
}
inline int check(int o){
if(!o)return ;int _=;
for(int i=;i<=;i++)if(t1[o].maxv[i]<=it.d[i])_++;
if(_==)return _;
_=;
for(int i=;i<=;i++)if(t1[o].minv[i]>it[i])_=;
return _;
}
inline int calcdis(Point x,Point y){
for(int i=;i<=;i++)if(x[i]>y[i])return ;
return x.v;
}
void query(int o){
ans=max(calcdis(t1[o],it),ans);
int dl=check(lson),dr=check(rson);
if(dl==)ans=max(ans,t1[lson].ma);
else if(dl&&ans<t1[lson].ma)query(lson);
if(dr==)ans=max(ans,t1[rson].ma);
else if(dr&&ans<t1[rson].ma)query(rson);
}
int main(){
n=read();
for(int i=;i<=;i++)t1[].minv[i]=inf,t1[].maxv[i]=-inf;
t1[].ma=-inf;
for(int i=;i<=n;i++){
t2[i].in();t2[i].v=;
}
sort(t2+,t2+n+);
int _=;
for(int i=;i<=n;i++){
ans=;it=t2[i];
query(rt);
t2[i].v+=ans;it=t2[i];
_=max(_,t2[i].v);ins(rt,);
}
printf("%d\n",_);
}

四维偏序(K-D-Tree+rebuild)的更多相关文章

  1. 论如何优雅的用bitset来求四维偏序

    四维偏序.. 就是给你一个四维集合.再给你一些询问,请你求出a[i].x1<=ask.x1&&a[i].x2<=ask.x2&&a[i].x3<=as ...

  2. [BZOJ1790][AHOI2008]Rectangle 矩形藏宝地(四维偏序,CDQ+线段树)

    1790: [Ahoi2008]Rectangle 矩形藏宝地 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 553  Solved: 193[Subm ...

  3. 四维偏序 CDQ套CDQ

    对CDQ深一步的理解 昨天做了一道CDQ,看了一堆CDQ可做的题,今天又做了一道四维偏序 感觉对CDQ的理解又深了一点,故来写一写现在自己对于CDQ的理解 CDQ其实就是实现了这样的一个问题的转化: ...

  4. 【教程】CDQ套CDQ——四维偏序问题

    前言 上一篇文章已经介绍了简单的CDQ分治,包括经典的二维偏序和三维偏序问题,还有带修改和查询的二维/三维偏序问题.本文讲介绍多重CDQ分治的嵌套,即多维偏序问题. 四维偏序问题       给定N( ...

  5. COGS2479(四维偏序)

    题意:给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 分析:cdq分治 ...

  6. HDU 5126 stars (四维偏序+树状数组)

    题目大意:略 题目传送门 四维偏序板子题 把插入操作和询问操作抽象成$(x,y,z,t)$这样的四元组 询问操作拆分成八个询问容斥 此外$x,y,z$可能很大,需要离散 直接处理四维偏序很困难,考虑降 ...

  7. COGS 2479. [HZOI 2016]偏序 [CDQ分治套CDQ分治 四维偏序]

    传送门 给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 对于100%的 ...

  8. hdu 5126 stars (四维偏序,离线,CDQ套CDQ套树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5126 思路:支持离线,那么我们可以用两次CDQ分治使四维降为二维,降成二维后排个序用树状数组维护下就好 ...

  9. 第46届ICPC澳门站 K - Link-Cut Tree // 贪心 + 并查集 + DFS

    原题链接:K-Link-Cut Tree_第46屆ICPC 東亞洲區域賽(澳門)(正式賽) (nowcoder.com) 题意: 要求一个边权值总和最小的环,并从小到大输出边权值(2的次幂):若不存在 ...

随机推荐

  1. Leetcode 55. Jump Game & 45. Jump Game II

    55. Jump Game Description Given an array of non-negative integers, you are initially positioned at t ...

  2. 目标检测之Faster-RCNN的pytorch代码详解(模型训练篇)

    本文所用代码gayhub的地址:https://github.com/chenyuntc/simple-faster-rcnn-pytorch  (非本人所写,博文只是解释代码) 好长时间没有发博客了 ...

  3. Julia 学习笔记(一):数组

    个人向,只会记录一些需要注意的点. 前言 学习 Julia 已经有一段时间了,但是进步缓慢.这一方面是最近代码写得少,一方面是 Julia 学习资料少.中文资料更少,但也有我没做笔记的缘故导致学习效率 ...

  4. BZOJ 2669 CQOI2012 局部极小值 状压dp+容斥原理

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2669 题意概述:实际上原题意很简洁了我就不写了吧.... 二话不说先观察一下性质,首先棋盘 ...

  5. 移动端webapp如何隐藏浏览器的导航栏

    webapp如何隐藏浏览器的导航栏 在webapp开发中,手机浏览器的导航栏会让我们的页面看起来很怪异,这个时候我们就需要将导航栏给隐藏起来,隐藏的方法十分简单,只需要在head头中加入以下几行代码就 ...

  6. C#中的Stack的Peek操作,曝出异常

    我们在遍历一个栈的时候,有时候需要判断栈顶元素,用到了Peek元素,然后再用Pop元素,但是这个时候会出现一个逻辑错误, 当用Pop删除全部栈的元素时,再用Peek就会报错, InvalidOpera ...

  7. sc"

    2.11 题目:二叉搜索树中的最近公共祖先 2.12 设计思路 if 树中不存在 u 或 v 错误 结束程序 定义 p 指向根节点 while true do: if p->key大于 u 和 ...

  8. 关于debian配置的问题汇总

    debian的apache多域名配置: https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-ho ...

  9. thrift的lua

    thrift的lua实现 最近要进行系统升级,后台的数据是根据城市区分的.担心新系统的稳定性及新数据的准确性,计划部分城市采用新接口.接口的入参里没有城市信息,只有经纬度坐标,需要调用一个thrift ...

  10. P4754 True Vegetable

    题目描述 小A现在有 NN 道题,编号为 1,2,\cdots,N1,2,⋯,N .每道题的起始毒瘤程度为 00 或 11 .在每回合,小A可以将编号连续的 KK 道题的毒瘤程度+1.但小B因为本身比 ...