王室聯邦:樹分塊,參見popoqqq大神的部落格,講得很詳細
莫隊:小z的襪子
樹上莫隊:把前面兩個東西結合在一起,不要管什麼xor,就是寫乙個solve,走過的路徑賦成走過,因為lca沒走過,所以沒計算過,加進去,計算後再減去,因為lca最終是不需要的
蘋果樹(不知道對不對)
#include#includeview code#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;
}
學習筆記 樹上莫隊
其實樹上莫隊是乙個尤拉序而已嘛,像普通的莫隊,特判一下出現過兩次的值就行了 設 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 求樹上兩點間路徑上有多少個不同的點權。序列上的莫隊是把詢問按照左端點分塊了 可是樹上沒有左端點,怎麼辦呢?我們把樹分塊...