kd-tree

[KD-tree] Luogu P3769 TATT

半世苍凉 提交于 2019-11-25 16:52:08
题目描述 四维空间真是美妙。 现在有 nn n个四维空间中的点,请求出一条最长的路径,满足任意一维坐标都是单调不降的。 注意路径起点是任意选择的,并且路径与输入顺序无关(路径顺序不一定要满足在输入中是升序)。 题解 第一维排序,然后就是个3D-tree 代码 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #define N 50010 6 using namespace std; 7 int n,ans,Ans,D,root,fa[N],pos[N],p[3][4]; 8 struct node 9 { 10 int d[4],id; 11 bool operator < (const node &a) const { return d[D]<a.d[D]; } 12 }a[N]; 13 struct kdtree{int d[3],mn[3],mx[3],ch[2],v,q;}t[N]; 14 bool cmp(node a,node b) { for (int k=3;~k;k--) if (a.d[k]^b.d[k]) return a.d[k]<b.d[k]; return a.id<b.id; } 15 void change(int x