洛谷 P3391 文藝平衡樹

2022-05-20 00:48:11 字數 2464 閱讀 5298

--by洛谷

裸的平衡樹反轉;

方法是按序列位置為關鍵字排序;

反轉(l,r):

則將l-1置於根處,將r+1作為根的右兒子,這樣,r+1的左子樹就是需要反轉的區間;

然後對r+1的左兒子,反轉其左右兒子,並打上線段樹一樣的lazy標記,待以後反轉她的子樹;

一開始,企圖把位置維護為關鍵字,然後排序;

這樣,若點a為父節點的左兒子,則key[a]=key[fa[a]]-size[rs[a]]-1;

若點a為父節點的右兒子,則key[a]=key[fa[a]]+size[ls[a]]+1;

然後查詢直接按查詢關鍵字的方法找,十分方便;

然而關鍵字是時時變化的,不好維護,

另一種方法是直接在初次建好樹後就再也不考慮維護關鍵字的問題,

直接按第k大的方法搜尋,(從某種意義上講她早已不是一般意義上的查詢樹了)

怎麼辦,選哪種方法繼續呢?

乙個很好的方法是把兩個都寫出來,

反正差不多

多好啊,還能對拍,是吧

**如下:

1 #include2

using

namespace

std;

3int

n,m;

4struct

dt;8

struct

splay

15void splay(int x,int

end)25}

26if(!end)

27 root=x;28}

29void roll(int

x)39

void up(int

x)42

void buil_splay(int l,int r,int&nu,int

fa)55

int find(int

x)63

if(x<=data[data[i].ch[0

]].size)

64 i=data[i].ch[0

];65

else69}

70if

(data[i].lz)

75return

i;76}77

void change(int

x)82

void print(int

now)

88if(data[now].ch[0

])89 print(data[now].ch[0

]);90

if(data[now].key!=0&&data[now].key!=n+1

)91 printf("

%d "

,data[now].key);

92if(data[now].ch[1

])93 print(data[now].ch[1

]);94}95

};96

splay splay;

97int

main()

98111

splay.print(splay.root);

112 }

view code

1 #include2

using

namespace

std;

3int

n,m;

4struct

dt;8

struct

splay

15void splay(int x,int

end)25}

26if(!end)

27 root=x;28}

29void roll(int

x)39

void up(int

x)42

void buil_splay(int l,int r,int&nu,int

fa)55

int find(int

x)65

return

i;66}67

void change(int

x)73

if(data[fa].ch[0]==x)

74 data[x].value=data[fa].value-data[data[x].ch[1]].size-1;75

else

76 data[x].value=data[fa].value+data[data[x].ch[0]].size+1;77

}78void print(int

now)

89};

90splay splay;

91int

main()

92107

splay.print(splay.root);

108 }

another_way

祝ac

洛谷 P3391 文藝平衡樹

您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列,其中需要提供以下操作 翻轉乙個區間,例如原有序序列是5 4 3 2 1,翻轉區間是 2,4 的話,結果是5 2 3 4 1 輸入格式 第一行為n,m n表示初始序列有n個數,這個序列依次是 1,2 n 1,n m表示翻轉操作次數 接下來m行每...

洛谷P3391 文藝平衡樹

傳送門 to luogu 題外話 一開始用splay text splay 寫了一發,結果 然後就換成了treap text treap 嗯,無旋treap text treap 直接用split text split 把 l,r l,r l,r 割下來,然後打標記。當然,因為翻轉之後將不滿足二叉搜...

洛谷P3391 文藝平衡樹 Splay

時間限制1.00s 記憶體限制125.00mb 您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列。其中需要提供以下操作 翻轉乙個區間,例如原有序序列是 54321,翻轉區間是 2,4 的話,結果是 52341。第一行兩個正整數 n,m表示序列長度與操作個數。序列中第 i項初始為 i。接下來 ...