線段樹 劃分樹 樹狀陣列

2021-08-28 01:17:40 字數 1366 閱讀 9112

線段樹    利用陣列來維護乙個類似字首和的區間和  在查詢的時候查這個區間陣列    特殊操作   有延時標記  在區間陣列上增加基本不改變原來陣列    以達到節省時間的目的   

樹狀陣列  和線段樹類似    乙個用乙個陣列維護類似字首和的東西   但  是   它維護的是乙個用二進位制表示的字首和  舉個例子  1是1、2是1 2、3是3、4是1 2 3 4、5是5、6 是5 6、7是7、8是1 2 3 4 5 6 7 8 

劃分數    用兩個二位陣列  來查詢區間內第幾大的數     第乙個陣列是存數的  另乙個是用來存前i個有幾個進入了左側 還有 陣列是對半分的  每次下一層都是上層區間對半分  

ll tree0[1000000];

ll tree11[20][1000000];

ll tree12[20][1000000];

void build_tree(ll x,ll y,ll n)

ll sum=y-x+1;

ll mid=(x+y)>>1;

ll max1=tree0[mid];

ll right=0,left=0;

for(i=x;i<=y;i++)

else

}線段樹

#define length node[i].r-node[i].l+1

struct qwe

};ll upup(ll i)

ll build_tree(ll i,ll l,ll r)

ll m=node[i].mid();

build_tree(i<<1,l,m);

build_tree(i<<1|1,m+1,r);

upup(i);

}ll updown(ll i,ll lenth)

}ll update(ll l,ll r,ll i,ll v)

updown(i,length);

ll mid=node[i].mid();

if(r<=mid)

else

else

}}ll querty(ll i,ll l,ll r)

updown(i,length);

//兩種書寫方式都行

i=i<<1;

if(node[i].r>=l)

else

querty(i,l,node[i].r);

}i++;

if(node[i].l<=r)

else

querty(i<<1,node[i].l,r);

}//第二種

ll mid=node[i].mid();

if(mid>=r)

else

return sum;

}

線段樹,樹狀陣列,主席樹

樹狀陣列 主席樹 包括無修改和可修改。用乙個滿二叉樹 葉子節點可以為空 來維護乙個連續陣列,整個樹的所有葉子節點從左到右表示整個陣列,每個非葉子節點表示其所有葉子的集合所描述的乙個連續子陣列的某一特性 最小值,最大值等 可以在logn的複雜度內實現對任意連續欄位的給定特性的查詢 最小值等 可以在lo...

Apple Tree(樹狀陣列 線段樹)

description 3 1 2 1 3 3 q 1 c 2 q 1 sample output 3 2 題目大意 一棵樹上長了蘋果,每乙個樹枝節點上有長蘋果和不長蘋果兩種狀態,兩種操作,一種操作能夠改變樹枝上蘋果的狀態,另一種操作詢問某一樹枝節點一下的所有的蘋果有多少。樹狀陣列版 include...

線段樹 樹狀陣列 總結

前言在對這三個資料結構進行了粗淺的學習之後,博主發現資料結構的世界是多麼的美妙。然後在博主的專業作死技能加持之下,三個資料結構的大戰一觸即發 對於某些題目 如,單點更新並且查詢區間和 那麼這個時候,我們會發現用樹狀陣列也十分吃香,畢竟這正是樹狀陣列所擅長的!它的時間複雜度均為o log n 相比於線...