四维偏序(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的次幂):若不存在 ...
随机推荐
- CentOS环境安装JDK(二)
安装JDK-7u79-linux-x64 打开虚拟机,进入终端: 1.假设用户名是tianjiale(则需要进入管理员角色,既root) (1).将用户名tianjiale添加到sudoer列表中 提 ...
- sql between and 边界问题
1.不同的数据库对 BETWEEN...AND 操作符的处理方式是有差异的.需要自己测试 2.一般情况下.SQL Server中 between and是包括边界值的,not between不包括边界 ...
- Documentation & Markdown
Documentation & Markdown markdown to document & document website generator https://github.co ...
- sql数值比较
- 51nod 1831 小C的游戏(博弈论+打表)
比较坑的题目. 题意就是:给出一堆石子,一次操作可以变成它的约数个,也可以拿只拿一个,不能变成一个,最后拿的人输. 经过打表发现 几乎所有质数都是先手必败的,几乎所有合数都是先手必胜的 只有几个例外, ...
- Springboot2.0 集成shiro权限管理
在springboot中结合shiro教程搭建权限管理,其中几个小细节的地方对新手不友好,伸手党更是无法直接运行代码,搭建过程容易遇坑,记录一下.关键的地方也给注释了. 版本:springboot版本 ...
- [洛谷P3254]圆桌问题
题目大意:有$m$个单位,每个单位有$r_i$个代表,有$n$张餐桌,每张餐桌可容纳$c_i$个代表.要求同一个单位的代表不在同一个餐桌就餐.若可以,输出$1$以及其中一种方案,否则输出$0$ 题解: ...
- [学习笔记]最小割之最小点权覆盖&&最大点权独立集
最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...
- MySQL使用笔记(三)表的操作
By francis_hao Dec 11,2016 表的操作 表的操作有创建表.查看表.删除表和修改表 创建表 创建表之前要在某个数据库中. mysql> create table ta ...
- POJ3349 Snowflake Snow Snowflakes (hash
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 48624 Accep ...