其实只是放个代码,会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. 教你如何用Docker快速搭建深度学习环境

    本教程搭建集 Tensorflow.Keras.Coffe.PyTorch 等深度学习框架于一身的环境,及jupyter. 本教程使用nvidia-docker启动实例,通过本教程可以从一个全新的Ub ...

  2. Linux e1000e网卡驱动

    目录 识别网卡 命令行参数 附加配置 技术支持 一.识别网卡e1000e驱动支持Intel所有的GbE PCIe网卡,除了82575,82576,基于82580系列的网卡.提示:Intel(R) PR ...

  3. Mac上利用Aria2加速百度网盘下载

    百度网盘下载东西的速度那叫一个慢,特别是大文件,看着所需时间几个小时以上,让人很不舒服,本文记录自己在mac上利用工具Aria2加速的教程,windows下思路也是一样! 科普(可以不看) 这里顺带科 ...

  4. [剑指Offer] 6.旋转数组的最小数字(二分法)

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...

  5. POJ 3693 Maximum repetition substring(最多重复次数的子串)

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10461   Ac ...

  6. [ZJOI2005]沼泽鳄鱼 矩阵乘法

    ---题面--- 题解: 乍一看还是挺懵逼的.和HH去散步很像,思路也是类似的. 复制一段我在HH去散步的题解里面写的一段话吧: 考虑f[i][j]表示i和j是否右边相连,有为1,否则为0,那么f同时 ...

  7. 【NOIP模拟赛】beautiful 乱搞(平衡树)+ST

    biubiu~~~ 我用平衡树处理的这道题,然而这种方法还是要看评测姬..... 正解是乱搞....就是枚举每一位数作为中位数,比他小的看做-1比他大的看做1,那么我们从一开始就有了一个绵延的山,我们 ...

  8. 用原生JavaScript做个简单的回到顶部

    很多网页在下方都会放置一个“返回顶部”按钮,尤其是页面底部没有导航的网页,这样可以帮助访客重新找到导航或者重温一遍广告(想得真美).随着近几年来 JavaScript 的应用日渐广泛,滑动效果无处不在 ...

  9. ng双向数据绑定

    http://blog.csdn.net/callmekongkong/article/details/54601585

  10. codeforces 1065D

    题目链接:https://codeforces.com/problemset/problem/1065/D 题意:给你一个又1~n^2组成的n行n列的矩阵,你可以走日字型,直线,斜线,现在要求你从1走 ...