資料結構習題 線段樹 樹狀陣列

2022-08-22 05:03:14 字數 2248 閱讀 3803

說明:這是去年寫了一半的東西,一直存在草稿箱裡,今天整理東西的時候才發現,還是把它發表出來吧。。

以下所有題目來自lrj的《訓練指南》

la 2191

單點修改,區間和  fenwick直接搞

uva 12299

給出n個數,支援迴圈移動某些數(<30個),然後問區間最小值

因為移動小於30個數,所以直接單點修改就行,線段樹。

la 4108

類似線段樹,每次插入乙個建築時想線段樹一樣二分區間,當遇到乙個完整的區間時,修改或返回,否則繼續二分區間。nlogn.

uva 11525

有題解說可以逆向考慮用線段樹,我沒明白怎麼回事。

說一下我的做法:

考慮問題(k,n)表示1~k的全排列中第n個。顯然1~k的全排列可以分為k種,每種有(k-1)!種情況,那麼如果確定了第n個排列屬於哪一種,問題就轉化為了(k-1,m);

再考慮題目的輸入。n的輸入形式正好是按以上思想給出的,那麼我們是需要把這個式子轉化為標準形式即可。

判斷每個si,若si>(k-i+1),就要」進製」。所以從後向前掃瞄,可以在o(n)時間內解決。

la 4730

並查集+線段樹。用並查集維護每個州,同時維護每個州的上端點(up)和下端點(down)。

用線段樹維護[a,b]內有多少個城市。方法是連線a和b時,[a.down,a.up]-=a.count; [b.down,b.up]-=b.count;  [new.down,new.up]+=new.count;

二維線段樹

先存一下(以下**僅供參考 準確性無法保證233)

view code

1 #include 2 #include 3 #include 4 #include 5

#define rs(x) (x*2+1)

6#define ls(x) (x*2)

7#define bigger(a,b) ((a)>(b)?(a):(b))

8#define minner(a,b) ((a)

9#define maxn (2000+10)

10#define root (1)

11#define inf (9999999)

12using

namespace

std;

13struct

segment_tree_2d;

19 typedef struct

treey treey;

20struct

treex;

25 typedef struct

treex treex;

26int

x1,x2,y1,y2,val,max_ans,min_ans,x0,y0;

27treex t[maxn];

28void queryy(int f,int r,int fa,int p)else39}

40void queryx(int f,int r,int p)else50}

51void modifyy(int fa,int p)else

60 t[fa].t[p].max=bigger(t[fa].t[ls(p)].max,t[fa].t[rs(p)].max);

61 t[fa].t[p].min=minner(t[fa].t[ls(p)].min,t[fa].t[rs(p)].min);62}

63void maintainy(int fa,int p)else

72 t[fa].t[p].max=bigger(t[fa].t[ls(p)].max,t[fa].t[rs(p)].max);

73 t[fa].t[p].min=minner(t[fa].t[ls(p)].min,t[fa].t[rs(p)].min);74}

75void modifyx(int

p)else84}

8586

void query()

87void

modify()

88};

89 typedef struct

segment_tree_2d st2;

90st2 t;

91int

main()

92102

}103 scanf("

%d",&q);

104for (i=0;i)else

114}

115return0;

116 }

刷題 資料結構 樹狀陣列 線段樹

1 數星星 複製自他人部落格 由於題目中給的資料是按y軸排序,我們只需構建x軸的樹狀陣列,也就是說我們只需統計星星i之前一共有多少個x座標小於或等於xi的星星,這個數值也就是星星i的等級 又因為樹狀陣列無法處理下標為0的元素 會死迴圈 所以要把每個x座標 1 include include incl...

高階資料結構(1) 線段樹與樹狀陣列

鑑於去年西安賽區被吐槽為線段樹專題賽區,就先更一發線段樹2333333 線段樹 segment tree 本質上來講是一棵二叉搜尋樹。它與區間樹類似,它的每乙個結點都是一段區間。線段樹的功能是快速查詢某個結點在若干線段中出現的次數,時間複雜度為o logn 單純空間複雜度為o 2n 實際應用中,為了...

模板 線段樹 資料結構 線段樹練習題三

給定一條長度為m的線段,有n個操作,每個操作有3個數字x,y,z表示把區間 x,y 染成顏色z,詢問染完色之後,這條長度為m的線段一共有幾種顏色。規定 線段的顏色可以相同。連續的相同顏色被視作一段。問x軸被分成多少段。乙個n,乙個l,n行x1,x2,color 被分成多少段 4 2010191 29...