基於這道題的關於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個數,這個...