LCT解法解決資料結構神薙bzoj1036

2021-07-10 10:18:47 字數 1409 閱讀 5381

確實是神(mo ban)薙(ti)

好多資料結構都靠這個入門- -

用lct解這道題也很簡單。

維護val,maxval,sum.

change的時候把這個點旋到當前splay的根,然後進行操作

qmax,先把u設為整棵樹的根,再把v旋到當前splay的根,然後找到當前樹(u-v這條路徑)的根,讀取資訊

qsum,和上面一樣,讀取sum.

然後就是模板了:

#include#include#include#include#include#include#includeusing namespace std;

const int maxn=30000+20;

const int inf=0x3f3f3f3f;

struct node

tree[maxn],*null,tnull;

void init(node *u)

void pushup(node *u)

void pushdown(node *u)

}bool isroot(node *u)

void rotate(node *u)

u->ch[d^1]=f;

f->f=u;

pushup(f);

pushup(u);

}int cnt;

node *sta[maxn];

void splay(node *u)

while(cnt)pushdown(sta[--cnt]);

while(!isroot(u))

else

}pushup(u);

}node *access(node *u)

return v;

}int n,m;

int head[maxn];

struct edge

e[2*maxn];

int det[maxn];

int k;

void add(int u,int v)

void dfs(int u,int f)

}void changeroot(node *u)

char ss[20];

node *getroot(node *u)

void qmax(node *u,node *v)

void qsum(node *u,node *v)

void change(node *u,int v)

int main()

{ k=1;

memset(head,-1,sizeof(head));

null=&tnull;

init(null);

scanf("%d",&n);

for(int i=1;i<=n;i++)init(&tree[i]);

for(int i=1;i

FHQ Treap小結(神級資料結構!)

首先說一下,這個東西可以搞一切bst,treap,splay所能搞的東西 今天心血來潮,想搞一搞平衡樹,思路比較好理解,但是 量。一看就頭大,然後,在洛谷翻題解的時候無意間看到了遠航之曲發的一篇非常短小精悍的題解,於是就學了一下 這個東西的學名應該是叫做fhq treap,應該是treap的強化版。...

資料結構的非經典解法

把要維護的序列分成 n 塊,每塊長度 n 最後一塊的長度為n n 2 對於單次區間操作 被該區間包含的整塊打上標記,左端和右端剩餘部分 小於2n 個 直接暴力操作,複雜度為o n 分塊 2.莫隊 離線 對於一系列區間操作 假設我們在已知區間 l r 的答案,在o f n 的時間複雜度內能夠得到 l ...

12 2 LCT 可持久化資料結構

12.2 lct 可持久化資料結構 例題 彈飛綿羊 bzoj2002 修改時一次cut,一次link,而詢問x時只需access x splay x 然後輸出左子樹大小 1即可 洞穴勘測 bzoj2049 只需要換根之後在link就行了。樹的統計 bzoj1036 修改x的值只需將x旋轉到其所在輔助...