用可以提取區間的平衡樹,對區間整體打標記,先不下放,等到操作涉及這個節點時再下放:交換左右兒子並給左右兒子打標記
我用的是無旋treap
剛開始需要建樹,建樹模仿笛卡爾樹,由於所有元素出棧之後自身的兒子不會再有變化,因此出棧的時候再push_up即可,由於棧維護右鏈,棧頂就是root
要看splay版本的也可以去這裡看》splay版本文藝平衡樹(在部落格比較靠下的位置)
/*
1.因為維護正確順序,因此中序遍歷需要得到原陣列,所以插入的時候下標越小數越小
2.之後就是選取區間操作,已經在樹中就沒有大小之分,只有順序,此時只能按照個數**
3.pushup操作在build函式中:出棧元素,構建完之後的棧內元素
4.下放標記有點拎不清,標記了就可以,等到需要下放再交換,注意本質的東西,當前資訊對的情況下能懶則懶,不需要交換子節點就等到需要下放的時候再交換
*/#includeusing namespace std;
#define ll long long
#define for1(i,a,b) for (int i=a;i<=b;i++)
#define for0(i,a,b) for (int i=a;i=0 && pri[i]=0) ch[sta[tot]][1] = i;
sta[++tot] = i;
}while (tot>=0) push_up(sta[tot--]);
root = sta[0];
}void split(int rt,int k,int &x,int &y)
else
push_up(rt);}}
int merge(int x,int y)
else }}
void reverse(int l,int r)
bool flag;
void dfs()
void dfs(int now)
}ftp;
int main()
ftp.dfs();
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的講解 將由這篇部落格開始。include include include include include include include include include include include include define lowbit x x x define ...