扩张的红黑树,每个结点增加一个size属性。
解题思路:
按输入顺序,不断insert,在insert时,判断
当往下走(寻找要插入的位置)时,走到一个结点(设为A)的左子树时,z小于A和A右子树,且z出现在A和A右子树之后(对于输入数组来说),故z和A、z和A右子树的所有结点形成逆序对。
#include<cstdio>
#include<queue>
#include<iostream>
#include<algorithm>
//#include<windows.h>
using namespace std;
enum RBCOLOR{RED,BLACK};
class RBNODE{
public:
int key;
RBNODE* left;
RBNODE* right;
RBNODE* parent;
RBCOLOR color;
int size;
RBNODE(int key){this->key=key;}
};
class RB{
public:
RBNODE *root;
RBNODE *nil;
int inversion_count;
RB(){nil=new RBNODE('#');root=nil;nil->color=BLACK;inversion_count=0;nil->size=0;}
~RB(){delete_tree(root);}
void LEFT_ROTATE(RBNODE* x)
{
RBNODE* y=x->right;x->right=y->left;
if(y->left!=nil) y->left->parent=x;
y->left=x;
if(x->parent==nil) root=y;
else if(x==x->parent->left) x->parent->left=y;
else x->parent->right=y;
y->parent=x->parent;x->parent=y;
y->size=x->size;
x->size=