BZOJ.2716.[Violet3]天使玩偶(K-D Tree)

题目链接

KD-Tree.因为插入过多点后可能会退化成链,所以左/右子树sz > α*整棵子树sz时对整棵子树进行重构。

树的节点数必须是3n?why?洛谷,BZOJ都这样。。(数据范围错了吧 和SYJ摆棋子一样n=5e5→_→)
但是n=5e5为什么仍要3倍空间(重构的话)。。迷。

吊打CDQ。

[Upd] 为啥我以前写不怎么加fread。。

//65280kb   14368ms
#include 
#include 
#include 
#define gc() getchar()
#define alpha (0.75)
const int N=(3e5+5),INF=0x7fffffff;

int n,Q,root,D_now,Ans,top,sk[N*2];

struct Point{
    int d[2];
}p[N*2];
struct Node{
    int ls,rs,sz,Min[2],Max[2];
    Point pt;
}t[N*3];//?

inline int read()
{
    int now=0;register char c=gc();
    for(;!isdigit(c);c=gc());
    for(;isdigit(c);now=now*10+c-'0',c=gc());
    return now;
}
inline bool cmp(const Point &a,const Point &b){
    return a.d[D_now]r) return 0;
    int mid=l+r>>1, k=New_Node();
    D_now=D, std::nth_element(p+l,p+mid,p+r+1,cmp);
    t[k].pt=p[mid], Init(k);
    t[k].ls=Build(l,mid-1,D^1), t[k].rs=Build(mid+1,r,D^1);
    Update(k); return k;
}
void DFS(int rt,int num)
{
    if(t[rt].ls) DFS(t[rt].ls,num);
    p[num+t[t[rt].ls].sz+1]=t[rt].pt, sk[++top]=rt;
    if(t[rt].rs) DFS(t[rt].rs,num+t[t[rt].ls].sz+1);
}
inline void Check(int &k,int D){
    if(alpha*t[k].sz

2018.5.21 又写了遍,常数好像小了?(然并软)

//65280kb   14264ms(fread:65576kb   12412ms)
#include 
#include 
#include 
#define gc() getchar()
#define alpha (0.75)
const int N=5e5+5,INF=0x7fffffff;

namespace KD_Tree
{
    int n,Q,root,Now_d,top,sk[N<<1],Ans;
    struct Point{
        int d[2];
    }p[N<<1];
    struct Node{
        int Min[2],Max[2],ls,rs,sz;
        Point pt;
    }t[N*3];//??
    
    inline bool Cmp_d(const Point &a,const Point &b){
        return a.d[Now_d]r) return 0;
        int mid=l+r>>1,k=New_Node();
        Now_d=D, std::nth_element(p+l,p+mid,p+r+1,Cmp_d);
        t[k].pt=p[mid], Init(k);
        t[k].ls=Build(l,mid-1,D^1), t[k].rs=Build(mid+1,r,D^1);
        Update(k); return k;
    }
    void DFS(int rt,int num)
    {
        if(t[rt].ls) DFS(t[rt].ls,num);
        p[num+t[t[rt].ls].sz+1]=t[rt].pt, sk[++top]=rt;
        if(t[rt].rs) DFS(t[rt].rs,num+t[t[rt].ls].sz+1);
    }
    inline void Check(int &k,int D){
        if(t[k].sz*alpha

转载于:https://www.cnblogs.com/SovietPower/p/9033507.html

你可能感兴趣的:(BZOJ.2716.[Violet3]天使玩偶(K-D Tree))