讀入之類的優化措施

2021-09-19 23:31:18 字數 1382 閱讀 1774

一:

讀入優化

inline int read()

二:字串操作對比

char cmd[10];

if (cmd[0]==『c』)//字元陣列

//操作;

else if(cmd[0]=='d)

//操作;

else

//操作

;2string s;

if (strcmp(s,「c」))//不知道是否可行,以後試試

三:資料結構結構體寫法

//以結構體為例

struct lin-cut-tree//結構體巢狀

對node的操作;

normalize()//代表將某個平衡樹的子樹正常化,實際上是維護標記下傳

leftrotate()//左旋操作

rightrotate()//右旋操作

splay()//splay操作

access()//基操,將v到根節點的路徑上的所有邊都變為實邊,當然,為了保證實邊,虛邊劃分的性質,一部分原來的實邊也要相應變為虛邊。注意該操作會將v下方的實邊變為虛邊。如圖所示的是針對結點h的expose操作。

find_root()//尋找樹根,我們只要對結點v執行access操作,便使得v與要找的根節點在同一顆平衡樹中了。然後,要找的根節點一定是實路徑的尾部,即平衡樹中的最左結點。

evert()//該操作等價於將v到v所在樹的根節點的路徑上的所有邊取反。首先執行access(v)操作,我們便已經將該條路徑取出了。由於路徑是用平衡樹維護,所以需要執行的是平衡樹的逆序。給平衡樹結點用打標記的方式反序。這裡由於是對整顆平衡樹反序,所以標記應該打在平衡樹的根節點處。用打標記的方式維護的時候,要對整顆平衡樹的旋轉等操作進行相應的維護。

cut() //首先將u置為有根樹的根節點,從而保證v一定是u的子節點。再對v執行access操作,我們便將u和v合併到同一平衡樹中了。此時對v執行splay操作使其成為所在平衡樹的根節點,同時分離v和v的左子樹,便完成了邊的刪除操作。

link()//為了保證連線後得到的樹形態亦然合法(即為有根樹),我們需要令u成為其所在樹的根節點。我們將u變為其所在樹的根節點,同時要將u用splay操作移動到其所在平衡樹的根節點。此時,u的左子樹必然為空。我們將v用splay操作移動到其所在平衡樹的根節點,然後令u的左孩子為v,然後令u的左孩子為v,便完成了連線操作。

public:

對t的操作,極好的實現了封裝

}lin-cut-tree t;//建立了物件

在主函式中直接對物件進行操作

init()

t.make_tree()//建樹

t.getroot()//類似並查集方式,判斷兩樹是否在同乙個聯通塊中。

t.addedge()//加邊,u和v連邊,與連通性相關

t.destroy()//摧毀邊

真的讀入優化與假的讀入優化

一直以來,我都是這樣寫讀入優化的。inline char nc inline void read int x 然後有道題死活過不去,把讀入優化改成scanf就過了。這才發現,我一直都寫的是假的!讀入優化!真正的讀入優化要這樣寫!inline char nc inline void read int ...

比「讀入優化」更優的讀入方式

序 相信很多oier在讀取大量資料的時候普遍採取讀入優化的方式讀入 如下,基本類似 inline void read 無符號型 return input return 通過其他部落格我們發現比這樣更快的是fread,可惜不會用 經過尋找,在知乎上找到了比讀入優化更快的方法。測試表明比讀入優化快10 ...

比「讀入優化」更優的讀入方式

序 相信很多oier在讀取大量資料的時候普遍採取讀入優化的方式讀入 如下,基本類似 inline void read 無符號型 return input return 通過其他部落格我們發現比這樣更快的是fread,可惜不會用 經過尋找,在知乎上找到了比讀入優化更快的方法。測試表明比讀入優化快10 ...