ETT學習筆記

2021-10-03 18:26:28 字數 1946 閱讀 5836

ett(eular tour tree)是一種維護有根樹的資料結構,支援以下操作

修改乙個點的點權

子樹修改

單點查詢

點到根路徑查詢

修改乙個點的父親

據說可以支援換根,但用的不多而且據說很難寫,所以似乎失傳了(

其實沒啥技術含量,顧名思義就是維護一棵樹的尤拉序。

尤拉序指在 dfs 開始和結束時分別將當前點加入序列中,也稱括號序。

用區間平衡樹維護這個尤拉序。

平衡樹不寫 treap ,根本不是人

每個點第一次插入的權值為題目給定的權值,第二次插入時取相反數,要在平衡樹上記錄下這個符號,並記錄下 每個原樹上的點 兩次插入時 在平衡樹上的點 的編號。

對treap額外維護平衡樹上的父結點 fa,然後可以找到給定編號的結點在平衡樹上的排名。

單點操作直接搞就可以了。

因為尤拉序上乙個子樹對應的是乙個括號,子樹修改時直接修改這個括號的區間。注意每個點要分別乘上自己的符號,可以通過記錄平衡樹的子樹的符號之和實現。

對於鏈查詢,不難看出是這個點第一次出現的位置的字首和,直接查詢即可。

修改父親直接把整個括號提出來插進新父親第一次位置的後面。

複雜度是o(n

log⁡n)

o(n\log n)

o(nlogn)

,跑得比較慢

模板題

#include

#include

#include

#include

#include

#include

#include

#define maxn 200005

#define maxm 400005

using

namespace std;

inline

char

gal(

)inline

intread()

typedef

long

long ll;

vector<

int> e[maxn]

;int w[maxn]

;int sig[maxn]

,ind[maxn]

,siz[maxn]

,rad[maxn]

,ch[maxn][2

],fa[maxn]

,tot;

ll val[maxn]

,sum[maxn]

,lzy[maxn]

;inline

intnewnode

(int v,

int type)

inline

void

update

(int x)

inline

void

pushlzy

(int x,ll v)

inline

void

pushdown

(int x)

}int

merge

(int x,

int y)

void

split

(int x,

int k,

int& l,

int& r)

int rt,l[maxn]

,r[maxn]

;inline

void

modify

(int l,

int r,

int v)

inline

intgetrk

(int x)

return ans;

}void

dfs(

int u)

intmain()

if(op==

'c')

if(op==

'f')

}return0;

}

E TT 的神秘任務3

tt 貓咖的生意越來越紅火,人越來越多,也越來越擁擠。為了解決這個問題,tt 決定擴大營業規模,但貓從 來呢?tt 第一時間想到了神秘人,想要再次通過完成任務的方式獲得貓咪。而這一次,神秘人決定加大難度。給定乙個環,a 1 a 2 a 3 a n 其中 a 1 的左邊是 a n 要求從環上找出一段長...

BZOJ 3786 星系探索 ETT

物理學家小c的研究正遇到某個瓶頸。他正在研究的是乙個星系,這個星系中有n個星球,其中有乙個主星球 方便起見我們預設其為1號星球 其餘的所有星球均有且僅有乙個依賴星球。主星球沒有依賴星球。我們定義依賴關係如下 若星球a的依賴星球是b,則有星球a依賴星球b.此外,依賴關係具有傳遞性,即若星球a依賴星球b...

談談DRAM的檢測等級(eTT與uTT)

說完了ett utt,下面再說說fail out 淘汰的 顆粒。這些fail out的顆粒也是經過廠商的測試,但是很不幸地它們是檢測不過關的產品。這些顆粒並不一定在檢測時就出了問題,但是它們達不到合格的記憶體的高速讀寫可靠性的長期要求 簡單的可以認為是壽命評估不達標 那麼它們拿來幹嘛呢?我們可以看到...