您需要寫一種資料結構(可參考題目標題),來維護乙個有序數列,其中需要提供以下操作:翻轉乙個區間,例如原有序序列是5 4 3 2 1,翻轉區間是[2,4]的話,結果是5 2 3 4 1
n,m<=100000
splay拿來練翻轉
這題就只用支援翻轉,很裸
翻轉區間[x,y]的操作:
提取該區間,打乙個bool型別的lazy tag,值為1表示該區間要翻轉。
翻轉兩次乙個區間相當於不翻轉,因此打標記的**是bz[x]=bz[x] xor 1
當以後做的時候走到這個點,就要先down一下標記,具體過程是交換其兩個子樹,標記下傳,該點標記清空。
也就是線段樹lazy tag的思想。當然提取區間需要維護size,需要查詢區間第k個元素
注意,因為有區間翻轉操作,所以kth的時候要下傳標記,要不然會找錯。
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
using
namespace
std;
const
int n=100010;
int n,m,top,root,t[n][2],f[n],size[n];
bool bz[n];
bool pd(int x)
void update(int x)
void down(int x)
void rotate(int x)
void splay(int x,int y)
update(x);
if(!y) root=x;
}int kth(int x,int k)
void turn(int l,int r)
int main()
fo(i,2,n+1) printf("%d ",kth(root,i)-1);
return0;}
bzoj3223 文藝平衡樹
bzoj3223 文藝平衡樹 description 您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列,其中需要提供以下操作 翻轉乙個區間,例如原有序序列是5 4 3 2 1,翻轉區間是 2,4 的話,結果是5 2 3 4 1 input 第一行為n,m n表示初始序列有n個數,這個序列依次...
bzoj 3223 文藝平衡樹
題意 對於乙個1 n的序列。進行m次區間反轉操作 求最後反轉過的區間。n,m 100000。題解 splay躶題。寫完維修數列之後感覺這種題都好寫了。反轉啥的打個標記下傳就好,記得輸出時再pushdown標記就好了 這篇題解就是說一下單旋和雙旋的簡單差別 爺爺結點就是目標的情況不討論了 zig za...
bzoj 3223 文藝平衡樹
題目大意 維護乙個有序數列,其中需要提供以下操作 翻轉乙個區間,例如原有序序列是5 4 3 2 1,翻轉區間是 2,4 的話,結果是5 2 3 4 1 思路 splay 區間操作 棒神 1 include2 include3 include4 include5 include6 include7 i...