學習筆記 樹上莫隊

2022-04-30 10:51:09 字數 1351 閱讀 6844

王室聯邦:樹分塊,參見popoqqq大神的部落格,講得很詳細

莫隊:小z的襪子

樹上莫隊:把前面兩個東西結合在一起,不要管什麼xor,就是寫乙個solve,走過的路徑賦成走過,因為lca沒走過,所以沒計算過,加進去,計算後再減去,因為lca最終是不需要的

蘋果樹(不知道對不對)

#include#include

#include

#include

using

namespace

std;

#define n 200010

struct

edge

e[n];

struct

data

q[n];

int n,m,tot,cnt=1

,time,ans,top,size;

intdfn[n],belong[n],head[n],dep[n],used[n],c[n],p[n],s[n];

int fa[30

][n],answer[n];

void link(int u,int

v)bool

cp(data x,data y)

void reverse(int

u)

else

}void dfs(int u,int

last)

}s[++top]=u;

}void solve(int u,int

v)

else }

void

init()

int lca(int u,int

v) }

return fa[0

][u];

}int

main()

}dfs(root,0);

init();

for(int i=1;i<=m;i++)

sort(q+1,q+m+1

,cp);

solve(q[

1].u,q[1

].v);

int x=lca(q[1].u,q[1

].v);

reverse(x);

answer[q[

1].id]=ans;

if(p[q[1].a]&&p[q[1].b]&&q[1].a!=q[1].b) answer[q[1].id]--;

reverse(x);

for(int i=2;i<=m;i++)

for(int i=1;i<=m;i++) printf("

%d\n

",answer[i]);

return0;

}

view code

學習筆記 樹上莫隊

其實樹上莫隊是乙個尤拉序而已嘛,像普通的莫隊,特判一下出現過兩次的值就行了 設 st i 為 i 進棧的時間,ed i 為 i 出棧的時間,dfn x,那麼就可以分兩種情況 1 y 在 x 子樹中,也就是 lca x,y x 那麼區間轉化成 st x,st y 2 y 不在 x 子樹中,也就是 lc...

莫隊演算法學習筆記(三) 樹上莫隊

樹上莫隊的核心思想,就是將一棵樹轉化成乙個序列,然後用普通莫隊來搞。以一棵樹為例 要想對這棵樹進行樹上莫隊,我們第一步就是用乙個 s 陣列把它的括號序存下來 id 12 3456 78910 1112 1314 1516 s 12 4788 7455 2366 31 同時,我們用 i 陣列儲存每個數...

樹上莫隊演算法

繼續回來寫部落格 記錄點有意思的題目什麼的。貌似寫過這個的沒多少人 所以我也記錄一點。首先序列上的莫隊大家都應該很熟悉了 那麼樹上的莫隊要怎麼搞呢?先來看個題目 spoj cot2 求樹上兩點間路徑上有多少個不同的點權。序列上的莫隊是把詢問按照左端點分塊了 可是樹上沒有左端點,怎麼辦呢?我們把樹分塊...