文藝平衡樹就是splay,維護區間反轉,就是把所有左變成右,打個標記就好啦.一開始智障判斷是否為根節點的時候傻乎乎的判斷是否等於0...刪了就好啦!
題幹:
題目描述4321,翻轉區間是[2,4]的話,結果是5 234
1輸入輸出格式
輸入格式:
第一行為n,m n表示初始序列有n個數,這個序列依次是(
1,2,⋯n−1,n) (1,2, \cdots n-1,n)(1,2,⋯n−1
,n) m表示翻轉操作次數
接下來m行每行兩個數 [l,r][l,r][l,r] 資料保證
1≤l≤r≤n 1 \leq l \leq r \leq n 1
≤l≤r≤n
輸出格式:
輸出一行n個數字,表示原始序列經過m次變換後的結果
**:
#include#include#include
#include
#include
#include
#include
#define b cout << "breakpoint!" << endl;
#define o(a) cout << #a << " " << a << endl;
using
namespace
std;
#define duke(i,a,n) for(register int i = a;i <= n;i++)
#define lv(i,a,n) for(register int i = a;i >= n;i--)
#define clean(a) memset(a,0,sizeof(a))
const
int inf = 1
<< 30
;typedef
long
long
ll;typedef
double
db;template
void read(t &x)
int n,m,tot = 0
;int root = 0
;struct
node
}e[200010
];//
#define root e[1].ch[1]
inline void update(int
x)inline
void pushdown(intx)}
inline
int iden(int
x)inline
void connect(int x,int f,int
son)
inline
void rotate(int
x)/*
inline void splay(int at,int to)
else
}if(to == 0) root =at;
//cout<}
inline
void insert(int
x) u = ++tot;
//cout e[ff].v] =u;
e[u].init(x,ff);
splay(u,0);
}inline
int kth(int
k)
else
}}void write(int
u)inline
void work(int l,int
r)int
main()
*/while(m--)
*/}/*puts("");
duke(i,1,n + 2)
*/write(root);
puts(
"");
return0;
}
模板 文藝平衡樹
由於中序遍歷不會因為旋轉改變,平衡樹可以作為區間樹使用。翻轉用打標記的方法,splay x,y 代表把x接到以y為根的子樹下面。include include using namespace std const int maxn 100005 int n,m int val maxn siz max...
模板 文藝平衡樹
點此看題 最近學了無旋treap text treap 那就用它來水一發吧。反轉區間我們不考慮權值,一開始直接用merge text merge 插入,修改時直接split text split 出三個區間 1,l 1 l,r r 1,n 1,l 1 l,r r 1,n 1,l 1 l r r 1 ...
文藝平衡樹(splay模板)
題幹 splay模板,要求維護區間反轉。splay是一種碼量小於treap,但支援排名,前驅後繼等treap可求的東西,也支援區間反轉的平衡樹。但是有兩個壞處 1.splay常數遠遠大於treap以及stl中的set。2.沒有可持久化splay,但有可持久化treap。下面是 1.pushup以及p...