Splay 區間資訊的維護與查詢 靜態模板

2021-07-16 09:53:15 字數 980 閱讀 9008

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...