C 替罪羊树 玄关求条
查看原帖
C 替罪羊树 玄关求条
640816
cengzh楼主2025/2/4 17:20
# include <stdio.h>
# include <stdlib.h>

double alpha = 0.75;

typedef struct Tree{
	int val;
	int cnt;
	int size;
	int tag;
	struct Tree* Left;
	struct Tree* Right;
}Node;

Node* ini(int val)
{
	Node* tmp;
	tmp = (Node*) malloc (sizeof(Node));
	tmp->Left = tmp->Right = NULL;
	tmp->val = val;
	tmp->size = tmp->cnt = 1;
	tmp->tag = 1;
	return tmp;
}

void update(Node* node)
{
	node->size = node->cnt;
	if (node->Left != NULL)
	{
		node->size += node->Left->size;
	}
	if (node->Right != NULL)
	{
		node->size += node->Right->size;
	}
	return ;
}

int arrindex;
int arr[100005];

void add_arr(Node* node)
{
	if (node == NULL) return ;
	add_arr(node->Left);
	arr[arrindex++] = node->val;
	add_arr(node->Right);
	return ;
}

Node* build(int l,int r)
{
	if (l > r)
	{
		return NULL;
	}
	int mid = l + (r - l) / 2;
	Node* node = ini(arr[mid]);
	node->Left = build(l,mid-1);
	node->Right = build(mid+1,r);
	update(node);

	return node;
}

Node* rebuild(Node* node)
{
	arrindex = 0;
	add_arr(node);
	node = build(0,arrindex-1);
	return node;
}

Node* insert(Node* node,int val)
{
	if (node == NULL)
	{
		node = ini(val);
		return node;
	}

	if (val == node->val)
	{
		node->cnt++;
		node->size++;
		node->tag = 1;
		return node;
	}
	else if (val > node->val)
	{
		node->Right = insert(node->Right,val);
	}
	else
	{
		node->Left = insert(node->Left,val);
	}

	update(node);
	int threshold = alpha * node->size;

	if ((node->Left != NULL && node->Left->size > threshold) || (node->Right != NULL && node->Right->size > threshold))
	{
		node = rebuild(node);
	}

	return node;
}

Node* del(Node* node,int val)
{
	if (val == node->val)
	{
		node->cnt--;
		node->size--;
		if (!node->cnt)
		{
			node->tag = 0;
		}
		return node;
	}
	else if (val > node->val)
	{
		del(node->Right,val);
	}
	else
	{
		del(node->Left,val);
	}

	update(node);

	int threshold = alpha * node->size;

	if ((node->Left != NULL && node->Left->size > threshold) || (node->Right != NULL && node->Right->size > threshold))
	{
		node = rebuild(node);
	}

	return node;
}

int ans;

void rank(Node* node,int val)
{
	if (val == node->val)
	{
		if (node->Left != NULL)
		{
			ans += node->Left->size;
		}
	}
	else if (val > node->val)
	{
		if (node->Left != NULL)
		{
			ans += node->Left->size;
		}
		ans += node->cnt;
		rank(node->Right,val);
	}
	else
	{
		rank(node->Left,val);
	}

	return ;
}

void kth(Node* node,int k)
{


	int leftsize = 0;
	if (node->Left != NULL)
	{
		leftsize = node->Left->size;
	}
	if (leftsize >= k)
	{
		kth(node->Left,k);
	}
	else if (node->cnt + leftsize >= k)
	{
		ans = node->val;
		return ;
	}
	else
	{
		kth(node->Right,k-(node->cnt + leftsize));
	}

	return ;
}

void last(Node* root, int key) {

    while (root)
    {
        if (root->val < key)
        {
            if (root->tag)
            {
                ans = root->val;
            }
            root = root->Right;
        }
        else
        {
            root = root->Left;
        }
    }
    return ;
}

void next(Node* root, int key) {

    while (root)
    {
        if (root->val > key)
        {
            if (root->tag)
            {
                ans = root->val;
            }
            root = root->Left;
        }
        else
        {
            root = root->Right;
        }
    }
    return ;
}


int main (void)
{
	Node* root = NULL;
	int n;
	scanf ("%d",&n);
	for (int i=0;i<n;i++)
	{
		int op,x;
		scanf ("%d %d",&op,&x);
		if (op == 1)
		{
			root = insert(root,x);
        }
		else if (op == 2)
		{
			root = del(root,x);
		}
		else if (op == 3)
		{
			ans = 0;
			rank(root,x);
			printf ("%d\n",ans+1);
		}
		else if (op == 4)
		{
			ans = 0;
			kth(root,x);
			printf("%d\n",ans);
		}
		else if (op == 5)
		{
		    ans = 0;
            last(root,x);
            printf ("%d\n",ans);
		}
		else if (op == 6)
		{
		    ans = 0;
            next(root,x);
            printf ("%d\n",ans);
		}
	}

	return 0;
}

2025/2/4 17:20
加载中...