函式式線段樹的個人理解

2022-06-02 16:33:07 字數 1588 閱讀 1053

這幾天一直在搞這個東西,今天總算搞懂了,函式式線段樹是一種解決離線演算法的資料結構,我是這樣理解的,它將所有資料離散化,再對每乙個節點 n 建一顆(1,n)的線段樹,這是它的思路,當然如果真正的去建這麼多線段樹,記憶體肯定爆了,所以這個就是函式式線段樹的高階的地方,它從分利用字首和的思想,後一顆樹和前一棵樹分享了一半的節點,什麼意思呢,若現在我們得到了t[n],也就是(1,n)這些節點的線段樹,我們要建(1,n+1)這顆線段樹t[n+1],這樣我們只需要在t[n]的基礎上加入a[n+1]這個節點,如果a[n+1]被放入t[n+1]的左子樹,那麼t[n+1]將和t[n]公用右子樹,同理,若a[n+1]被放入右子樹,t[n+1]將和t[n]公用左子樹,這樣就能減少太多記憶體的消耗了。而建好這顆樹之後我們就可以用它的性質去解決一些題目,特別是區間第k大數,可同屬處理動態和靜態的問題,對於靜態的若要查詢(l,r,k),只需看看r的左子樹和l-1的左子樹之差,若大於k,繼續向他們的左子樹查詢第k大值,若小於k,則要向他們的右子樹查詢k-他們的差,這樣直到到葉子節點,就是我們要的答案了。而對於動態的,我們可以用樹狀陣列來套這顆函式式線段樹,即樹狀陣列的每個節點都是一顆線段樹,這樣來處理,下面給出乙個靜態的程式

poj 2104

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x0f0f0f0f

using

namespace

std;

const

double pi=acos(-1.0

);const

double eps=1e-8

;typedef pair

pii;

const

int maxn=200000+10

;const

int n=maxn*30

;int

a[maxn],b[maxn],ls[n],rs[n],t[maxn],sum[n],n,m,tot;

void

init()

int build(int x,int

y)int insert(int root,int x,int

v)

else

sum[newroot]=sum[root]+v;

}return

temp;

}int get_k_num(int lroot,int rroot,int

k)

else

}returnl;}

intmain()

init();

t[0]=build(1

,m);

for (int i=1;i<=n;i++) t[i]=insert(t[i-1],a[i],1

);

while(q--)

}return0;

}

作者 chensunrise

Vue函式式元件個人理解

vue官方文件的demo總是會省略很多東西,對於我們這樣的小萌新十分不友好啊喂。函式式元件這塊兒 鏈結函式式元件 這個demo啊,並沒有實現什麼實際的東西,還是需要自己去編寫。我把它編輯好了,大家可以參考一下。首先,html這塊兒 當父元件傳過來的是空items時 var emptylist 當父元...

理解線段樹

線段樹 二叉搜尋樹 與區間樹 相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。使用線段樹可以快速的查詢某乙個節點在若干條線段中出現的次數,時間複雜度為o logn 對於線段樹中的每乙個非 葉子節點 a,b 它的左兒子表示的區間為 a,a b 2 右兒子表示的區間為 a b...

線段樹理解

當我覺得我學習演算法剛剛從萌新到入門的時候,一類給定乙個區間然後給定一系列操作的題徹底的打擊了我,那時我才醒悟,程式設計路上,我一直是萌新。線段樹是乙個具有樹特性的資料結構,它是一顆二叉搜尋樹。如下圖為區間 1,10 所建立的線段樹 將每乙個區間序列二分成小區間,線段樹就儲存小區間的資訊,也就是每個...