一堆模板(醜陋0 0) 資料結構

2022-05-26 02:30:12 字數 4045 閱讀 4990

1

//1.

主席樹模板練習--hdu2665 kth number

23 #include4 #include5 #include6 #include7 #include8 #include9 #include10

using

namespace

std;

11struct

treet[2000000

];14

int tot,a[100000],n,m,u[100000],root[100000

];15

int build_tree(int l,int

r)16

25return

now;

26}

27int next(int last,int l,int r,int

rank)

2838

return

now;39}

40int scr(int up,int down,int l,int r,int

k)41

48int

main()

4957 sort(u,u+n);

58int len=unique(u,u+n)-u;

59 tot=0; root[0]=build_tree(1

,len);

60for (int i=0;i)

6165

while (m--)66

71}72return0;

73 }

2.線段樹

1 #include2 #include3 #include4 #include5 #include6 #include7

#define llg long long

8#define maxn 200000*3+10

9using

namespace

std;

1011 llg i,j,ans,k,x,n,m,sum[maxn],set[maxn],addv[maxn],type,y,v,bj[maxn]/*

是否具有set標記*/;

1213

void

build(llg o,llg l,llg r)

1419

else25}

2627

void

pushdown(llg o,llg l,llg r)

2838

if(addv[o])

3944}45

46void

add(llg o,llg l,llg r)

47

54 llg lc=o*2,rc=o*2+1,mid=(r+l)/2;55

if (x<=mid) add(lc,l,mid);

56if (y>mid) add(rc,mid+1

,r);

57 sum[o]=sum[lc]+sum[rc];58}

5960

void

sum_(llg o,llg l,llg r)

6168 llg lc=o<<1,rc=o<<1|1,mid=(r+l)>>1;69

if (x<=mid) sum_(lc,l,mid);

70if (y>mid) sum_(rc,mid+1

,r);71}

72void

seet(llg o,llg l,llg r)73

76int

main()

7790

if (type==3)//

set91

95if (type==2)//

sum96

102}

103return0;

104 }

3.spaly

1 #include2 #include3 #include4 #include5 #include6 #include7

#define ll long long

8#define maxn 100010

9ll father[maxn],rightson[maxn],leftson[maxn],root;

10using

namespace

std;

11void right_rotate(ll x)//

右旋 12

21 rightson[x]=y; father[y]=x;22}

23/*

24右旋只需要三步:

251.將x的右子樹b(如果有的話)作為y的左子樹,同時讓b認y作爹

262.設z為原本y結點的父親,讓x認z做爹(如果z存在的話),將x作為z的兒子(是左是右得由y是z的左兒子還是右兒子決定,要左右一致)

273.將y作為x的右子樹,同時讓y認x作爹

28*/

29void

left_rotate(ll x)

30

39 leftson[x]=y;father[y]=x;

40}

41void splay(ll x,ll llg)//

表示將x不停向上旋轉,知道x成為結點為llg的子樹

42

50else

51

53else

if(rightson[z]==y && leftson[y]==x)

54else

if(leftson[z]==y && leftson[y]==x)

55else

56} 57

} 58

if(llg==0) root=x;

59}

60 ll findleft(ll x)//

找這個節點左子樹的最大值(前驅) 61

66 ll findright(ll x)//

找這個節點在右子樹的最小值(後繼)

6772

intmain()

73

4.並查集

1 #include2 #include3 #include4 #include5 #include6 #include7

#define yyj(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout);

8#define llg long long

9using

namespace

std;

10 llg i,j,k,n,m,dad[200100

],x,y;

11llg find (llg x)

1215

intmain()

1626 cin>>m;

27while (m--)

2832

return0;

33 }

5.樹狀陣列

1 #include2 #include3 #include4 #include5 #include6 #include7

#define yyj(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout);

8#define llg long long

9using

namespace

std;

10 llg a[1000],i,j,k,n,m,c[1000

],y,x,type;

11llg lowbit(llg x)

1215

void

add(llg w,llg v)

1621}22

llg sum(llg w)

2329

return

ans;30}

31int

main()

3240 cin>>m;

41while (m--)

4249

if (type==2)50

54}55return0;

56 }

資料結構知識 一 堆疊

堆是一類特殊的資料結構的統稱。堆通常是乙個可以被看做一棵樹的陣列物件。堆總是滿足下列性質 其中我們會了解到有二叉樹和斐波那契數。其中二叉樹中又有最小堆和最大堆的概念 二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作 左子樹 left subtree 和 右子樹 right subtree 二叉...

資料結構一一堆排序

堆排序 一種 樹形選擇排序 是對直接選擇排序的有效改進。綜上描述,它的實現需要解決兩個問題 1 如何由乙個無序序列構建成乙個堆?2 如何在輸出堆頂元素後,調整剩餘元素成為乙個新的堆?無序序列構建成乙個堆的 如下 初始堆進行調整 將l ielem 0.length 1 建成堆 調整完之後第乙個元素是序...

模板 資料結構 堆

heap,也就是堆,作為常用的優先佇列的替代品,其實還是有優越性的。make heap v.first v.end cmp 把容器調整成堆。push heap v.first v.end cmp 在容器本身是堆,往容器的end中插入後,把end後移,再呼叫這個。pop heap v.first v....