--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 #include2view codeusing
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 }
1 #include2another_wayusing
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 }
祝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。接下來 ...