四维偏序(K-D-Tree+rebuild)
其实只是放个代码,会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)的更多相关文章
- 论如何优雅的用bitset来求四维偏序
四维偏序.. 就是给你一个四维集合.再给你一些询问,请你求出a[i].x1<=ask.x1&&a[i].x2<=ask.x2&&a[i].x3<=as ...
- [BZOJ1790][AHOI2008]Rectangle 矩形藏宝地(四维偏序,CDQ+线段树)
1790: [Ahoi2008]Rectangle 矩形藏宝地 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 553 Solved: 193[Subm ...
- 四维偏序 CDQ套CDQ
对CDQ深一步的理解 昨天做了一道CDQ,看了一堆CDQ可做的题,今天又做了一道四维偏序 感觉对CDQ的理解又深了一点,故来写一写现在自己对于CDQ的理解 CDQ其实就是实现了这样的一个问题的转化: ...
- 【教程】CDQ套CDQ——四维偏序问题
前言 上一篇文章已经介绍了简单的CDQ分治,包括经典的二维偏序和三维偏序问题,还有带修改和查询的二维/三维偏序问题.本文讲介绍多重CDQ分治的嵌套,即多维偏序问题. 四维偏序问题 给定N( ...
- COGS2479(四维偏序)
题意:给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 分析:cdq分治 ...
- HDU 5126 stars (四维偏序+树状数组)
题目大意:略 题目传送门 四维偏序板子题 把插入操作和询问操作抽象成$(x,y,z,t)$这样的四元组 询问操作拆分成八个询问容斥 此外$x,y,z$可能很大,需要离散 直接处理四维偏序很困难,考虑降 ...
- COGS 2479. [HZOI 2016]偏序 [CDQ分治套CDQ分治 四维偏序]
传送门 给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 对于100%的 ...
- hdu 5126 stars (四维偏序,离线,CDQ套CDQ套树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5126 思路:支持离线,那么我们可以用两次CDQ分治使四维降为二维,降成二维后排个序用树状数组维护下就好 ...
- 第46届ICPC澳门站 K - Link-Cut Tree // 贪心 + 并查集 + DFS
原题链接:K-Link-Cut Tree_第46屆ICPC 東亞洲區域賽(澳門)(正式賽) (nowcoder.com) 题意: 要求一个边权值总和最小的环,并从小到大输出边权值(2的次幂):若不存在 ...
随机推荐
- c#执行插入sql 时,报错:异常信息:超时时间已到。在操作完成之前超时时间已过或服务器未响应
问题:c#执行插入sql 时,报错:异常信息:超时时间已到.在操作完成之前超时时间已过或服务器未响应 解决: SqlCommand cmd = new SqlCommand(); cmd.Comman ...
- BZOJ 4011 HNOI2015 落忆枫音 DAG上的dp(实际上重点在于分析)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4011 题意概述:给出一张N点的DAG(从1可以到达所有的点),点1的入度为0.现在加一条原 ...
- Z.XML-Cocos2d-x开发笔记
大家都在热火朝天的使用Cocos2d-x引擎做游戏开发,那么大家不妨把过程中解决的关键问题记录在这里,做一个分享! 1.在Android平台下打开网页 1.1修改项目工程源文件 在你的项目工程源文件中 ...
- 最短路径——Floyd算法(含证明)
通过dij,ford,spfa等算法可以快速的得到单源点的最短路径,如果想要得到图中任意两点之间的最短路径,当然可以选择做n遍的dij或是ford,但还有一个思维量较小的选择,就是floyd算法. 多 ...
- android多点触控自由对图片缩放
在系统的相册中,观看相片就可以用多个手指进行缩放. 要实现这个功能,只需要这几步: 1.新建项目,在项目中新建一个ZoomImage.java public class ZoomImageView e ...
- lintcode-49-字符大小写排序
49-字符大小写排序 给定一个只包含字母的字符串,按照先小写字母后大写字母的顺序进行排序. 注意事项 小写字母或者大写字母他们之间不一定要保持在原始字符串中的相对位置. 样例 给出"abAc ...
- 《学习OpenCV》课后习题解答9
题目:(P126) 创建一个程序,使其读入并显示一幅图像.当用户鼠标点击图像时,获取图像对应像素的颜色值(BGR),并在图像上点击鼠标处用文本将颜色值显示出来. 解答: 本题关键是会用cvGet2D获 ...
- [转]dojo/mouse
dojo/mouse Authors:Kris Zyp Project owner:Kris Zyp since:1.7.0 Contents Usage enter leave mouseButto ...
- sql数值比较
- 黑群晖DSM 6.1网卡支持列表
黑群晖DSM 6.1网卡支持列表 Network Drivers====================================AMDamd8111e : AMD 8111 (new PCI ...