NOI2003 Editor(塊狀鍊錶)

2022-03-01 11:45:54 字數 1843 閱讀 5933

傳送門

看了看塊狀鍊錶,就是陣列和鍊錶的合體。

看上去好高大尚,思想也很簡單。

但是發現**量也不是很小,而且**理解起來也是費盡得很,倒不如splay用起來順手。

在加上適用範圍貌似不是特別廣,所以只把模板貼在這,只當了解思想,暫時先不使用。(也不會用啊)

1 #include2 #include3 #include4 #include5

using

namespace

std;67

const

int n=1

<<25;8

const

int blocksize=20000;9

const

int blocknum=n/blocksize*3;10

11int

t,_;

12int

cur;

13char str[5000005],opt[100

];14 queue q;

15struct

node

16a[blocknum+1000

];20

21void

init()

2226

void read(int

len)

2736}37

//新開乙個塊的節點

38int

newnode()

3943

//**塊的節點

44void delnode(int

t)45

48//

找到pos所在的塊,並使pos表示在當前塊中的位置

49void find(int &pos,int &now)

5054

//將新快賦值

55void fillnode(int pos,int n,char data,int

nxt)

5660

//將塊pos在p位置前後分開,變成兩個塊

61void split(int pos,int

p)62

68//

把碎塊合併

69void maintain(int

pos)

7078}79

//在游標pos處插入長度為n的str

80void insert(int pos,int

n)81

93if (i

9499

maintain(now);

100}

101//

從游標pos開始刪除長度為n的字串

102void del(int pos,int

n)103

116//

從pos這個位置開始輸出長度為n的字串

117void

get(int pos,int

n)118

128if (i1) memcpy(str+i,a[t].data,n-i);

129 str[n]=0

;130

}131

intmain()

132145

if (opt[0]=='

p') cur--;//

游標左移

146if (opt[0]=='

n') cur++;//

游標右移

147if (opt[0]=='

d')//

刪除一段區間

148152

if (opt[0]=='

g')//

輸出一段區間

153158

}159 }

view code

NOI2003 逃學的小孩

演算法 最短路 樹的直徑 難度 noip 注意 多年oi一場空,不開long long見祖宗!如果不開long long,應該會被卡到60分!注意 dfs找樹的直徑時,傳的引數 d 也要開long long哦!首先,因為無論如何答案都會包括a到b的dis,所以我們先用2遍dfs找到dis a b 的...

NOI2003 逃學的小孩

傳送門 here 題意 給出一棵樹 帶權 要從乙個節點c先走到距離它近的乙個節點b,再走到a,要求最壞情況下的總路程 即最長 解題思路 乍一看,a,b,c都沒給出,這怎麼求?不妨設距離c較近的點位a。分析發現,無論怎樣,a b是一定要走的。那麼如何能讓樹上任意兩點間距離最大呢?不難發現a,b就是該樹...

NOI2003 逃學的小孩

chris家的 鈴響起了,裡面傳出了chris的老師焦急的聲音 喂,是chris的家長嗎?你們的孩子又沒來上課,不想參加考試了嗎?一聽說要考試,chris的父母就心急如焚,他們決定在盡量短的時間內找到chris。他們告訴chris的老師 根據以往的經驗,chris現在必然躲在朋友shermie或ya...