splay樹除了被用作平衡二叉樹之外,還有許多更高階但我們不常用的功能,比如:用splay的旋轉操作來維護區間資訊,這裡的旋轉優先順序我們可以用乙個rank來表示,則rank[i]就代表了第i個點的優先順序(對應的就是原來的序列中的位置標號),通過依據對位置標號的旋轉操作,我們可以更加方便直觀的維護乙個區間的總和、最值等資訊,並且理論複雜度與線段樹相當。
#include
#include
#include
using
namespace
std;
const
int maxn = 2000 + 10;
const
int inf = 0x3f3f3f3f;
struct splaytree
int newnode(int val, int k)
void push_up(int u)
void rotate(int u)
void splay(int u, int pos)
}void join(int u, int k, int val)
splay(n, 0);
}void insert(int k, int val, int u)
void update(int k, int val, int u)
int d = k >= rank[u];
if(c[u][d])
update(k, val, c[u][d]);
push_up(u);
}int query(int x, int y)
}spt[maxn], test;
char s[20];
int n, m;
int x, y, z, x1, y1, x2, y2;
int main()
while(m--) else
}return
0;}
區間資訊的維護和查詢系列演算法 樹狀陣列
樹狀陣列的學習是看的這篇博文,從樹狀陣列的作用,原理和實現來講解。仔細看看會有收穫,下面是我自己的對樹狀陣列的體會。1.樹狀陣列的應用。當我們求解乙個動態連續和查詢問題的時候,樹狀陣列就派上了用場,它是一種資料結構,進行連續和查詢時的時間複雜度為o logn 從上圖中我們可以發現乙個規律,由a陣列和...
bzoj3173 Splay 維護字首中的最大值
大致題意 有乙個空序列,依次插入1 n到該序列中,每次指定插入的位置,每次插入完成返回當前序列的lis的長度。題解 設dp i 表示 字首1 i的最長上公升子串行的長度。因為是按照遞增順序插入的,所以當剛插入完某個數到i位置 此時能保證該數是當前序列的最大值 dp i max 1 include 2...
維護動態區間的中位數
依次讀入乙個整數序列,每當已經讀入的整數個數為奇數時,輸出已讀入的整數構成的序列的中位數。詳細內容 最樸素寫法,每到奇數時位將前面所有資料排序,找到中位數 每次sort是 o nlog n 一組資料需要sort frac 次,所以複雜度為 o n 2log n include include usi...