四维偏序(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的次幂):若不存在 ...
随机推荐
- RMQ问题+ST算法
一.相关定义 RMQ问题 求给定区间的最值: 一般题目给定许多询问区间. 常见问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大 ...
- 另外一种C#多选下拉框
链接: https://pan.baidu.com/s/1tnLgC9P_V8y9qHTYSg8xGA 密码: cwxj
- 在程序内部跳转到下一个页面 和 向另一个servlet发起跳转
request.getRequestDispatcher("/success.html").forward(request,response); request.getReques ...
- PHP的报错级别并返回当前级别error_reporting()
定义和用法:error_reporting() 设置 PHP 的报错级别并返回当前级别.函数语法:error_reporting(report_level) 如果参数 level 未指定,当前报错级别 ...
- ASP.NET页面之间传值Session(2)
想必这个肯定是大家使用中最常见的用法了,其操作与Application类似,作用于用户个人,所以,过量的存储会导致服务器内存资源的耗尽. 优点:1.使用简单,不仅能传递简单数据类型,还能传递对象. 2 ...
- 正式进军Matlab图像处理
Matlab取整函数有:fix, floor, ceil, round,具体应用方法如下: 1. fix朝零方向取整,如fix(-1.3) = -1; fix(1.3) = 1; 2. floor顾名 ...
- Xinetd服务的安装与配置
Xinetd服务的安装与配置 http://blog.chinaunix.net/uid-21411227-id-1826885.html 1.什么是xinetd xinetd即extended in ...
- gdb调试命令的使用及总结
gdb调试命令的使用及总结 gdb是一个在UNIX环境下的命令行调试工具.如果需要使用gdb调试程序,请在gcc时加上-g选项.下面的命令部分是简化版,比如使用l代替list等等. 1.基本命令 命令 ...
- 洛谷 P2611 [ZJOI2012]小蓝的好友 解题报告
P2611 [ZJOI2012]小蓝的好友 题目描述 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物--小蓝的好友. 在帮小 ...
- Seajs的用法
以前经常听到Seajs,但是没深入了解过,不清楚到底是用做哪个方面,后来调组到M站做开发,发现项目用到了Seajs,便去了解下 SeaJS是一个遵循CMD规范的JavaScript模块加载框架,可以实 ...