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....