洛谷P3398 倉鼠找sugar

2022-05-23 21:42:10 字數 1082 閱讀 1552

題目大意:給你一棵$n(n\leqslant10^5)$個點的樹,$m(m\leqslant10^5)$次詢問,每次詢問路徑$a->b$和路徑$c->d$是否有交點

題解:經過觀察發現若有交點,在$lca_$或$lca_$一定有交,判斷一下即可

卡點:

c++ code:

#include #include #include #define maxn 100005

#include namespace r

int read()

#undef m

}namespace w

inline void put(const char __ch)

#undef m

}using r::read;

using w::put;

int n, m;

int head[maxn], cnt;

struct edge e[maxn << 1];

inline void addedge(const int a, const int b) ; head[a] = cnt;

e[++cnt] = (edge) ; head[b] = cnt;

}#define m 18

int fa[maxn][m], dep[maxn];

void dfs(const int u) }}

inline int lca(int x, int y)

#undef m

#define putre(x)

void solve(const int x1, const int y1, const int x2, const int y2) else

}int main()

dep[1] = 0;

dfs(1);

for (register int i = 1, x1, y1, x2, y2; i <= m; i++)

w::end();

return 0;

}

洛谷P3398 倉鼠找sugar

裸的lca。對於每次詢問,設a,b的lca為a,c,d的lca為b,分兩種情況討論 1 a與b的深度相同,此時二人相遇的充要條件為a b,即四個點的最近公共祖先相同。2 a與b深度不同,設a的深度大於b的深度,若二人相遇,則c或d與a的lca一定為a。include include define m...

洛谷 P3398 倉鼠找sugar(樹剖,LCA)

很顯然,就是在一棵樹上,求兩條路徑有沒有交點。我們可以先分別求出兩條路徑兩段點的lca,設為rtab和rtcd然後分以下情況討論 這時候可能會發現,會不會rtab和rtcd的深度相同這種情況呢?如果rtab和rtcd深度相同卻又不是同乙個節點 若是同乙個節點在第一種情況裡已經判斷 顯然兩條路徑不可能...

洛谷 3398 倉鼠找sugar

題目描述 小倉鼠的和他的基 me i mei mei 友 zi sug ar zi sugar zi su gar住在地下洞穴中,每個節點的編號為1 n1 n 1n。地下洞穴是乙個樹形結構。這一天小倉鼠打算從從他的臥室 a a a 到餐廳 b b b 而他的 同時要從他的臥室 c c c 到圖書館 ...