ett(eular tour tree)是一種維護有根樹的資料結構,支援以下操作
修改乙個點的點權
子樹修改
單點查詢
點到根路徑查詢
修改乙個點的父親
據說可以支援換根,但用的不多而且據說很難寫,所以似乎失傳了(
其實沒啥技術含量,顧名思義就是維護一棵樹的尤拉序。
尤拉序指在 dfs 開始和結束時分別將當前點加入序列中,也稱括號序。
用區間平衡樹維護這個尤拉序。
平衡樹不寫 treap ,根本不是人
每個點第一次插入的權值為題目給定的權值,第二次插入時取相反數,要在平衡樹上記錄下這個符號,並記錄下 每個原樹上的點 兩次插入時 在平衡樹上的點 的編號。
對treap額外維護平衡樹上的父結點 fa,然後可以找到給定編號的結點在平衡樹上的排名。
單點操作直接搞就可以了。
因為尤拉序上乙個子樹對應的是乙個括號,子樹修改時直接修改這個括號的區間。注意每個點要分別乘上自己的符號,可以通過記錄平衡樹的子樹的符號之和實現。
對於鏈查詢,不難看出是這個點第一次出現的位置的字首和,直接查詢即可。
修改父親直接把整個括號提出來插進新父親第一次位置的後面。
複雜度是o(n
logn)
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的顆粒也是經過廠商的測試,但是很不幸地它們是檢測不過關的產品。這些顆粒並不一定在檢測時就出了問題,但是它們達不到合格的記憶體的高速讀寫可靠性的長期要求 簡單的可以認為是壽命評估不達標 那麼它們拿來幹嘛呢?我們可以看到...