P3369 【模板】普通平衡树 (Splay)

写在前头

本篇题解不讲Splay的原理,只给代码和细节讲解,保证代码不会被hack掉,且及其简短。如果你是洛谷88分#12 TLE了的倒霉蛋,那么恭喜你,请直接跳转到注释版代码第63行。

来吧!

标准代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 1, INF = 0x3f3f3f3f;
int n;
struct Splay {
   
	int tot, root;
	int ch [N + 3] [2], fa [N + 3];
	int cnt [N + 3], siz [N + 3], val [N + 3];
	void Begin () {
   Insert (-INF); Insert (INF);}
	inline void rotate (int x) {
   
		int y = fa [x], z = fa [y];
		bool d1 = cald (y), d2 = cald (x);
		int s = ch [x] [!d2];
		fa [s] = y; fa [y] = x; fa [x] = z;
		ch [z] [d1] = x; ch [x] [!d2] = y; ch [y] [d2] = s;
		push_up (y); push_up (x);
	}
	void splay (int x, int tar = 0) {
   
		while (fa [x] != tar) {
   
			if (fa [fa [x]] != tar)
				rotate (cald (x) == cald (fa [x]) ? fa [x] : x);
			rotate (x);
		}
		if (!tar) root = x;
	}
	int get_pre (int k) {
   
		int pre, y = 0;
		for (int x = root; x; y = x, x = ch [x] [k > val [x]])
			if (val [x] < k) pre = x;
		splay (y);
		return pre;
	}
	int get_nxt (int k) {
   
		int nxt, y = 0;
		for (int x = root; x; y = x, x = ch [x] [k >= val [x]])
			if (val [x] > k) nxt = x;
		splay (y);
		return nxt;
	}
	int Get_Pre (int k) {
   return val [get_pre (k)];}
	int Get_Nxt (int k) {
   return val [get_nxt 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值