有關資料結構的知識17 5 1清北

2022-04-30 06:51:05 字數 4671 閱讀 8593

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

//#include89

using

namespace

std;

1011

**********過載運算子*************

12struct

rec13

20}g,gg;

21 ****************鍊錶************

22int

v[maxn],next[maxn],cnt;

2324

void

zou()鍊錶移動

2533}34

35void charu(int p,int

w)鍊錶插入

3642 ************棧***佇列***堆***********8

43int

main()

4465 *************並查集 ****************

66int

f[maxn];

6768

for (int a=1;a<=n;a++)

69 f[a]=a;

7071

int getf(int

now)

7276

77int merge(int p1,int

p2)78

8182

bool same(int p1,int

p2)83

86 ****************hash****************

87 maplong,int>ma;

88 map;

89 mapint>;

9091 ma[num]=ma[num]+1;92

ma[num];

93 ***************線段樹************

94 ***************遞迴**************

95int

a[maxn];

9697

int sum[maxn*4

];98

99void update(int

rt)100

103104

void build(int l,int r,int

rt)建立從l到r標號st

105111

int m=(l+r)/2

;112

//int m=(l+r)>>1;

113 build(l,m,rt*2

);建立左邊

114//

build(l,m,rt<<1);

115 build(m+1,r,rt*2+1

);建立右邊

116//

build(m+1,r,rt<<1|1);

117 ***********全部分離**********

118update(rt);填入數

119}

120 ***********

修改121

void modify(int l,int r,int rt,int p,int

v)122

128int m=(l+r)/2

;129

if (p<=m) modify(l,m,rt*2

,p,v);

130else modify(m+1,r,rt*2+1

,p,v);全部分離

131update(rt);將修改後的狀態全部改變

132}

133 ***********

求從nowl到nowr的值

134int query(int l,int r,int rt,int nowl,int

nowr)

135143

144 scanf("

%d",&n);

145for (int b=1;b<=n;b++)

146 scanf("

%d",&a[b]);

147 build(1,n,1

);148 modify(1,n,1

,p,v);

149 query(1,n,1

,nowl,nowr);

150 *****************

151notonlysuccess

152153 *******************樹狀陣列*********

154簡介:

155 對於乙個陣列求其l到r的值的和,即從l--r;利用分治(類似規定)算(2^lowbit(x)--r)+(l--r);再將2^lowbit(x)遞迴進行分解;

156 lowbit(x)是指將x轉化為2進製後,從低位到高位第1個"

1"的位置即第幾位(從0開始數)例如;lowbit(6)=1

;6的2進製為110,即2;

157 求[1,7]等價於 [7,7] + [1,6

]158 對應2^lowbit(7)--7

1--2^lowbit(7

)159 而[1,6]等價於 [4,5] + [1,4

]

160 對應 2^lowbit(4)--4

1-- 2^lowbit(4

);161

162 **************樹狀陣列*********

163 lb(x) = 2^lowbit(x)

164165

int lb(int

x)166

169170

z : 樹狀陣列

171y : 陣列

172173

void modify(int p,int

v)修改 將p位置的數改為v

174180

181int query(int

p)詢問

182188 *****************樹狀陣列偽***************

189 #include190

using

namespace

std;

191int n,m,i,num[100001],t[200001],l,r;//

num:原陣列;t:樹狀陣列

192int lowbit(int

x)193

196void change(int x,int p)//

將第x個數加p

197203

return

;204

}205

int sum(int k)//

前k個數的和

206213

return

ans;

214}

215int ask(int l,int r)//

求l-r區間和

216219

intmain()

220227

for(i=1;i<=m;i++)

228232

return0;

233}

234 *************塗色************

235for (int a=m;a>=1;a--)

236242

}243 *************分塊*****************

244int s=sqrt(n);分成塊的大小為sqrt(n);

245for (int i=1;i<=n;i++)

246 belong[i]=(i-1)/s+1

;belong[i]陣列表示第i個數所在的塊

247int cnt=belong[n];一共有幾塊

248249

for (int i=1;i<=cnt;i++)

250257

else size[i]=s;

258}

259for (int i=1;i<=n;i++)

260 sum[belong[i]]+=a[i];i所屬的那一塊的sum加上ai

261262

int query(int l,int

r)訪問

263271

while (belong[r]==belong[r+1])**從最後乙個整區間到最後

272276

for (int i=belong[l]+1;i<=belong[r]-1;i++)加入所有整區間的數

277 ans+=sum[i];

278return

ans;

279}

280281

void modify(int l,int r,int

v)修改

282289

while (belong[l]==belong[l-1

])自此往下同上訪問

290294

while (belong[r]==belong[r+1

])295

299for (int i=belong[l]+1;i<=belong[r]-1;i++)

300304 }

相信你會收穫很多**********

資料結構有關樹的知識總結(二)

哈夫曼樹的特點 權值越大,離根節點越近 樹中沒有度為1的結點,成為正則 嚴格 二叉樹 樹的帶權路徑長度 wpl 最短。應用於平常的壓縮檔案,是最基本的壓縮編碼。其原理是 如在網上傳送檔案在計算機中需要將檔案中的字元轉化成計算機語言 01語言 根據傳送的檔案中每個字元出現的頻率 即權值 構造哈夫曼樹,...

北理資料結構 行編輯

成績 10開啟時間 2017年10月10日 星期二 18 00 折扣0.8 折扣時間 2017年11月10日 星期五 23 55 允許遲交 否關閉時間 2017年11月17日 星期五 23 55 假設現在要開發乙個字元介面的編輯器,對文字的編輯操作是通過輸入乙個乙個的 行編輯命令 完成的。系統約定 ...

有關字元裝置的資料結構

1 file operations結構 include linux fs.h struct file operations 2 file結構 include linux fs.h struct file 說明 f mode 該成員表示檔案的讀寫權e限,由fmode read和fmode write標...