/******************************************
資料結構:
splay_tree,伸展樹;
性質:伸展樹是二叉查詢樹的一種改進;
與二叉查詢樹一樣,伸展樹也具有有序性;
即伸展樹中的每乙個節點x都滿足:
該節點左子樹中的每乙個元素都小於x;
而其右子樹中的每乙個元素都大於x;
與普通二叉查詢樹不同的是,伸展樹可以自我調整;
特點:伸展樹並不是嚴格意義上的平衡樹;
也還是極有可能退化成線性結構,但伸展操作能使它的每一次操作近似(logn);
伸展操作:
伸展操作和平衡樹的保持平衡是類似的;
只不過他不要求保持平衡,只是相應的旋轉;
旋轉有三種情況要處理:
(1)zig或zag(節點x的父節點y是根節點)
(2)zig-zig或zag-zag(節點x的父節點y不是根節點,且x與y同時是各自父節點的左孩子或者同時是各自父節點的右孩子)
(3)zig-zag或zag-zig(節點x的父節點y不是根節點,x與y中乙個是其父節點的左孩子而另乙個是其父節點的右孩子)
即一字型旋轉和之字型旋轉;
優勢:能快速定位乙個區間[l,r],並且能將區間進行刪除、旋轉操作;
將第l-1個結點旋轉至根(之前的splay操作),將第r+1個結點旋轉至根的右孩子;
由於伸展樹的本質還是二叉搜尋樹,則根據二叉查詢樹的性質可以知道;
在這兩個結點之間,也是根的右孩子的左子樹就包括節點[l,r];
即很快定位了區間[l,r],如果需要刪除,直接把子樹拿走即可;
演算法測試:
pku3468(a ****** problem with integers)
題目大意:
q a b :查詢區間[a,b]的和;
c a b x : 更新區間[a,b],區間所有值加上x;
*******************************************/
#include#include#include#includeusing namespace std;
#define key_value ch[ch[root][1]][0]//進行各種操作的區間
const int inf=0xffffff;
const int n=100010;
typedef long long ll;
int ch[n][2];//左右孩子(0為左孩子,1為右孩子)
int pre[n];//父結點
int key[n];//資料域
int size[n];//樹的規模
int val[n];
int add[n];
int a[n];//結點元素
ll sum[n];//子樹結點和
int root; //根結點
int tot;//結點數量
int n,q;
void push_up(int u)//通過孩子結點更新父結點
void push_down(int u)//將延遲標記更新到孩子結點
}void new_node(int &u,int f,int c)//新建乙個結點,f為父節點
void build_tree(int &u,int l,int r,int f)//建樹,中間結點先建立,然後分別對區間兩端在左右子樹建立
void rotate(int x,int c)//旋轉操作,c=0 表示左旋,c=1 表示右旋
pre[y]=x;
ch[x][c]=y;
push_up(y);
}void splay(int x,int f)//splay操作,把根結點x轉到結點f的下面
}push_up(x);// 最後再維護x結點
if(f==0)//更新根結點
}void rotate_under(int k,int f)//把第k位的數伸展到f下方
int get_pre(int x)//找前驅,即左子樹的最右結點
return key[x]-key[tmp];
}int get_next(int x)//找後繼,即右子樹的最左結點
return key[tmp]-key[x];
}ll query(int l,int r)//查詢[l,r]之間的和
void update(int l,int r)//更新
void init()//初始化
{ for(int i=0; i
資料結構 資料結構緒論
資料結構是相互間存在一種或多種特定關係的資料元素的集合。程式設計 資料結構 演算法 資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。資料元素是組成資料的 有一定意義的基本單位,是計算機中通常作為整體處理,也被稱為記錄。乙個資料元素可以由若干個資料項組...
資料結構 資料結構演算法
分治法 對於乙個規模為n的問題,若該問題可以容易地解決 比如說規模n較小 則直接解決 否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。動態規劃法 這種演算法也用到了分治思想,它的做法是將問題例項分解為更小的 相似的子...
資料結構 01 資料與資料結構
1.資料data 資料是描述客觀事物的符號,是計算機中可以操作的物件,是能被計算機識別,並輸入給計算機處理的符號集合。2.資料元素data elements 資料元素是組成資料的 有一定意義的基本單位,在計算機中通常作為整體進行處理。3.資料物件data object 資料物件是性質相同的資料元素的...