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

时间:2023-03-09 03:20:20
二叉树求逆序对(伪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 = ;
}
}*head; inline void pshup(nobe *rt)
{
rt->lsz = rt->rsz = ;
if (rt->lson) rt->lsz = + rt->lson->rsz + rt->lson->lsz;
if (rt->rson) rt->rsz = + rt->rson->rsz + rt->rson->lsz;
} void add(nobe *rt, int val)
{
if (val < rt->val) {
qans += rt->rsz + (long long);
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);
}