您需要寫一種資料結構(可參考題目標題),來維護乙個有序數列,其中需要提供以下操作:翻轉乙個區間,例如原有序序列是5 4 3 2 1,翻轉區間是[2,4]的話,結果是5 2 3 4 1
輸入格式:
第一行為n,m n表示初始序列有n個數,這個序列依次是(1,2……n-1,n) m表示翻轉操作次數
接下來m行每行兩個數[l,r] 資料保證 1<=l<=r<=n
輸出格式:
輸出一行n個數字,表示原始序列經過m次變換後的結果
輸入樣例#1:
5 31 31 3
1 4
輸出樣例#1:
4 3 2 1 5
n,m<=100000
又是一道模板題,怎麼那麼像線段樹啊。
不過好像不太一樣,至今不懂啥時候pushdown(想哭)。
#include#includeusing namespace std;
const int n=100005;
int n,m,rt,fa[n],tag[n],ch[n][2],sz[n];
void pushup(int x)
void pushdown(int x)
void rotate(int x,int &k)
void splay(int x,int &k)
rotate(x,k); }}
int fnd(int x,int rnk)
void split(int l,int r)
void rev(int l,int r)
void build(int l,int r,int f)
int mid=(l+r)/2;
build(l,mid-1,mid),build(mid+1,r,mid);
fa[mid]=f;
ch[f][mid>f]=mid;
pushup(mid);
}int main()
for(int i=2;i<=n+1;i++)
printf("%d ",fnd(rt,i)-1);
printf("\n");
return 0;
}
洛谷P3391 文藝平衡樹
傳送門 to luogu 題外話 一開始用splay text splay 寫了一發,結果 然後就換成了treap text treap 嗯,無旋treap text treap 直接用split text split 把 l,r l,r l,r 割下來,然後打標記。當然,因為翻轉之後將不滿足二叉搜...
洛谷 P3391 文藝平衡樹
by洛谷 裸的平衡樹反轉 方法是按序列位置為關鍵字排序 反轉 l,r 則將l 1置於根處,將r 1作為根的右兒子,這樣,r 1的左子樹就是需要反轉的區間 然後對r 1的左兒子,反轉其左右兒子,並打上線段樹一樣的lazy標記,待以後反轉她的子樹 一開始,企圖把位置維護為關鍵字,然後排序 這樣,若點a為...
洛谷P3391 文藝平衡樹 Splay
時間限制1.00s 記憶體限制125.00mb 您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列。其中需要提供以下操作 翻轉乙個區間,例如原有序序列是 54321,翻轉區間是 2,4 的話,結果是 52341。第一行兩個正整數 n,m表示序列長度與操作個數。序列中第 i項初始為 i。接下來 ...