資料結構 day 4 splay 平衡樹初步

2021-08-15 12:34:59 字數 3637 閱讀 6602

抓夢腳的一天。。。

給你乙個長為n 的序列:a1; a2; : : : ; an

你需完成q 個操作,操作分兩種:

• modify l r d 表示將l 到r 這個區間的數加上d

• query p 表示詢問p 這個位置的值

input

第一行乙個整數n。

第二行n 個整數表示a1; a2; : : : ; an。

第三行乙個整數q。

接下來q 行,每行乙個操作。

output

對於每個詢問操作,輸出結果。

#include#include#include#includeusing namespace std;

const int maxn=400005;

int n,q;

int a[maxn],tag[maxn],f[maxn];

bool flag[maxn];

void update(int o)

void build(int o,int lf,int rg)

int mid=(lf+rg)>>1;

build(o*2,lf,mid);

build(o*2+1,mid+1,rg);

update(o);

}void push_down(int o,int lf,int rg)

}void modify(int o,int lf,int rg,int l,int r,int de)

push_down(o,lf,rg);

int mid=(lf+rg)>>1;

if (l<=mid)

modify(o*2,lf,mid,l,r,de);

if (r>mid)

modify(o*2+1,mid+1,rg,l,r,de);

update(o);

}int query(int o,int lf,int rg,const int l,const int r)

int main()

if (s1[0]=='q')

}return 0;}/*

31 2 3

3query 2

modify 1 3 -2

query 2

*/

給你乙個序列,需要你執行兩種操作:

• modify l r a b 將區間[l; r] 中每個數ai 修改為aai + b。

• query l r 詢問區間[l; r] 中所有數的和,輸出和對109 + 7 取模的結果。

input

第1 行,乙個整數n,表示序列長度。

第2 行,有n 個整數:a1; a2; : : : ; an 表示序列。

接下來1 行,乙個整數q,表示詢問數。

接下來q 行,每行乙個操作。

output

對於每個詢問,輸出結果。

#include#include#include#includeusing namespace std;

const int mod=1e9+7;

const int maxn=4000005;

long long tagadd[maxn],tagmul[maxn],a[maxn],f[maxn];

bool flag[maxn];

int n,q;

void update(int o)

void build(int o,int lf,int rg)

int mid=(lf+rg)>>1;

build(o*2,lf,mid);

build(o*2+1,mid+1,rg);

update(o);

}void push_down(int o,int lf,int rg)

}void modify(int o,int lf,int rg,const int l,const int r,long long ch,long long he)

push_down(o,lf,rg);

int mid=(lf+rg)>>1;

if (l<=mid)

modify(o*2,lf,mid,l,r,ch,he);

if (r>mid)

modify(o*2+1,mid+1,rg,l,r,ch,he);

update(o);

}long long query(int o,int lf,int rg,const int l,const int r)

int readint()

while(xy!=' '&&xy!='\n')

return cc*pd;

}long long readlong()

while(xy!=' '&&xy!='\n')

return cc*pd;

}int main()

for (int i=1;i<=maxn-1;i++)

tagmul[i]=1;

build(1,1,n);

q=readint();

for (int i=1;i<=q;i++)

if (s1[0]=='m')

}return 0;}/*

31 2 3

3query 1 3

modify 2 3 2 3

query 1 3

*/

給你乙個長度為n 的序列,有m 個操作,操作有兩種型別,如下所示:

• d pos 表示刪除位置為pos 的數。

• q pos 表示詢問位置為pos 的數是什麼。

input

第1 行,兩個整數n;m;

第2 行,n 個整數:a1; a2; : : : ; an 表示初始序列;

接下來m 行,每行是上面兩種操作之一。

output

對於每個詢問,輸出其對應結果。

#include#include#include#includeusing namespace std;

const int n=400005;

int val[n],fa[n],n,idc,a[n],son[n][2],size[n],root;

char s1[15];

void update(int o)

int build(int f,int o,int l,int r)

void init(int o)

void rotate(int o,int d)

void splay(int nd,int top=0)

else

} }

}int find(int pos)

else if(lf<=pos-2)

else return s;

}} void del(int pos)

int readint()

while(xy!=' '&&xy!='\n')

return cc*pd;

}long long readlong()

while(xy!=' '&&xy!='\n')

return cc*pd;

}int main()

if(s1[0]=='d')

}

return 0;

}

讀入優化真的跑的飛快

splay 文藝平衡樹 資料結構

題目大意 略 splay維護區間翻轉裸題,為了減少不必要的麻煩,多插入兩個點,分別是0和n 1 每次找區間的第k個值,就在splay上二分即可 順便學了一下splay的完美建樹,而且splay有一些小函式可以巨集定義或者用inline,跑得飛快 最後跑一遍中序遍歷即可 1 include 2 inc...

資料結構 Splay伸展樹 普通平衡樹

題目描述 您需要寫一種資料結構 可參考題目標題 來維護一些數,其中需要提供以下操作 插入x數 刪除x數 若有多個相同的數,因只刪除乙個 查詢x數的排名 若有多個相同的數,因輸出最小的排名 查詢排名為x的數 求x的前驅 前驅定義為小於x,且最大的數 求x的後繼 後繼定義為大於x,且最小的數 輸入 第一...

資料結構入門6 文藝平衡樹(Splay)

早就聽說 splay 就是不管幹什麼都splay一下就可以了,但是聽說傻可開腦洞打 打了250行,驚恐。於是先學treap結果沒想到一除錯就搞了三個月。但是其實寫過treap再學splay就相對容易一些了。那就先學只有區間翻轉的文藝平衡樹。一開始一直弄不懂它的翻轉操作,感覺很迷。但是其實和treap...