P3391 模板 文藝平衡樹(Splay)

2021-09-11 08:11:17 字數 1589 閱讀 8915

基於這道題的關於splay的講解——將由這篇部落格開始。

#include #include #include #include #include #include #include #include #include #include #include #include #define lowbit(x) ( x&(-x) )

#define pi 3.141592653589793

#define e 2.718281828459045

#define inf 0x3f3f3f3f

#define half (l + r)>>1

#define lsn rt<<1

#define rsn rt<<1|1

#define lson lsn, l, mid

#define rson rsn, mid+1, r

#define ql lson, ql, qr

#define qr rson, ql, qr

#define myself rt, l, r

using namespace std;

typedef unsigned long long ull;

typedef long long ll;

inline int read()

while( ch<='9' && ch>='0' )

return x * t;

}const int maxn = 1e5 + 7;

int root, tot;

int n, m;

struct node

void init(int vv, int fa)

}t[maxn];

inline void pushup(int rt)

inline void pushdown(int rt)

}inline void rotate(int x) //對x進行旋轉操作

inline void splay(int x, int goal) //將x旋轉為goal的兒子,若goal為0,則將x旋轉至根的位置

if(goal == 0) root = x; //如果goal是0,那個根就是x

}void find(int x) //查詢值為x的位置並旋轉至根節點

void insert(int x) //插入x

if(u) t[u].cnt++; //存在這樣的點

else //不存在,要新建

splay(u, 0); //把當前位置移動到根,保證結構平衡

}int next(int x, int f) //0前驅、1後繼

else t[next].ch[0] = 0;

}int kth(int x)

else

}}inline void work(int l, int r)

void write(int u) //中序遍歷——左中右

inline void init()

int main()

write(root);

printf("\n");

return 0;

}

P3391 模板 文藝平衡樹

題目鏈結 題目描述 您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列。其中需要提供以下操作 翻轉乙個區間,例如原有序序列是 543 215 4 3 2 1 5432 1,翻轉區間是 2,4 2,4 2,4 的話,結果是 523 415 2 3 4 1 52341。輸入格式 第一行兩個正整數 ...

P3391 模板 文藝平衡樹(Splay)

題目背景 這是一道經典的splay模板題 文藝平衡樹。題目描述 輸入輸出格式 輸入格式 第一行為n,m n表示初始序列有n個數,這個序列依次是 1,2,n 1,n m表示翻轉操作次數 接下來m行每行兩個數 l,r 資料保證 1 l r n 輸出格式 輸出一行n個數字,表示原始序列經過m次變換後的結果...

P3391 模板 文藝平衡樹(Splay)

題目背景 這是一道經典的splay模板題 文藝平衡樹。題目描述 您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列,其中需要提供以下操作 翻轉乙個區間,例如原有序序列是5 4 3 2 1,翻轉區間是 2,4 的話,結果是5 2 3 4 1 輸入格式 第一行為n,m n表示初始序列有n個數,這個...