《算法竞赛进阶指南》平衡树

本文探讨了如何通过改进数据结构(如Treap和Set)以及优化算法(插入和查找操作)来提高营业额统计的效率,避免平衡二叉树的超时问题,重点展示了使用Treap进行快速前后元素查找的方法。
营业额统计
  • 不是平衡二叉树,超时
  • 指针
#include <bits/stdc++.h>
using namespace std;

const int INF = 1e7;
int n, x, res;
struct node {
   
   
	int val;
	node *l, *r;
	node (int x) {
   
   
		this->val = x;
		l = r = NULL;
	}
};
node *root;

void insert(node* &u, int x) {
   
   
	if (u == NULL) {
   
   
		u = new node(x);
	}
	else if (x > u->val) insert(u->r, x);
	else if (x < u->val) insert(u->l, x);
	//相等的数字不用添加
}

int get_prev(node* &u, int x) {
   
   
	if (u == NULL) return -INF;
	else if (x == u->val) return x;
	else if (x < u->val) return get_prev(u->l, x);
	else return max(u->val, get_prev(u->r, x));
}

int get_post(node* &u, int x) {
   
   
	if (u == NULL) return INF;
	else if (x == u->val) return x;
	else if (x > u->val) return get_post(u->r, x);
	else return min(u->val, get_post(u->l, x));
}

int main() {
   
   
	scanf("%d", &n);
	for (int i = 1; i <= n; i ++) {
   
   
		scanf("%d", &x);
		
		if (i == 1) res += x;
		else {
   
   
			int t1 = get_post(root, x);
			int t2 = get_prev(root, x);
			
			res += min(t1 - x, x - t2);
		}
		insert(root, x);
	}
	printf("%d", res);

	return 0;
}
  • 不是平衡二叉树,超时
  • 数组
#include <bits/stdc++.h>
using namespace std;

const int N = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值