二叉树求逆序对(伪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); }