二叉树求逆序对(伪AC 23333)

成链的时候 是最坏情况 O(n^2)的复杂度呢!

按照输入的数据 一个一个的插入建树 然后维护左右儿子的个数

 (我们规定, 左儿子 小于  父亲  右儿子大于父亲)

往左走 说明存在逆序对 逆序对的个数就是父亲+父亲右儿子的节点数

long long qans;

struct nobe {
    nobe *lson;
    nobe *rson; 
    int lsz;
    int rsz;
    int val;
    nobe () {
        lson = rson = NULL;
        lsz = rsz = val = 0;
    }
}*head;

inline void pshup(nobe *rt)
{
    rt->lsz = rt->rsz = 0;
    if (rt->lson) rt->lsz = 1 + rt->lson->rsz + rt->lson->lsz;
    if (rt->rson) rt->rsz = 1 + rt->rson->rsz + rt->rson->lsz;
}

void add(nobe *rt, int val)
{
    if (val < rt->val) {
        qans += rt->rsz + (long long)1; 
        if (rt->lson) {
            add(rt->lson, val);
        } else {
            rt->lson = new nobe;
            rt->lsz++;
            rt->lson->val = val;
        }
    } else {
        if (rt->rson) {
            add(rt->rson, val);
        } else {
            rt->rson = new nobe;
            rt->rsz++;
            rt->rson->val = val;
        }
    }
    pshup(rt);
}

 

posted @ 2018-07-22 11:32  过路人1998  阅读(280)  评论(0编辑  收藏  举报