雜題訓練之十一

2022-01-29 08:39:40 字數 1028 閱讀 1034

題目大意:

詢問樹上a到b,c到d的兩條路徑是否相交

分析:

我們容易發現,如果相交,記 x=lca(a,b),y=lca(c,d)則必有x在cd路徑上或y在ab路徑上

關鍵就在於如何判斷它在路徑上:

【複習】:結合如何判斷乙個點(x)是否在一條最短路上:起點(s)終點(t)各跑一次最短路(為了處理dis),如果dis(s,x)+dis(x,t)==dis(s,t),那麼x就在最短路上

此題因為是樹,兩點間只有唯一的最短路,模擬處理深度就好

code:

#include #define debug printf("passing [%s] in line %d.\n", __function__, __line__);

#define maxn 100005

using namespace std;

struct edge e[maxn<<1];

int n, t, fst[maxn], dep[maxn], dp[maxn][18];

int vis[maxn], lg[maxn];

inline int read()

inline int abs(int x)

inline int swap(int &x, int &y)

inline int addedge(int a, int b, int k)

, fst[a] = k;

}int build(int k, int d)

int prepare(int k)

int init()

inline int dis(int a, int b)

int work()

}int main()

雜題訓練之十

分析 考慮固定左端點l,列舉它 剩下的任務就是找到最小的r,使之 l,r 能夠出現b的子串行 這樣n r 1也就滿足,ans累加 是反著來的,效果是一樣的 學到了 分析 博弈論先考慮終止狀態 切記不要死迴圈的想 先手只剩一條邊時,先手必敗 後手只剩兩條邊時,先手必勝 然後發現本題唯一和博弈論沾邊的就...

雜題訓練之九

昨天和大佬們一起複習了堆 見此題不錯,於是寫一篇題解 題目大意 求長度在 l,r 的範圍的子串和前k大和 分析 考慮暴力一點,把所有滿足條件的字串加入乙個堆中 取的前k次就是前k大 發現這樣不太好 這樣的瓶頸在於要考慮所以字串 包括那些不太有用的 具體實現 對於區間 l,r 題目要求使得字串和最大,...

雜題訓練之五

奇數和偶數顯然是獨立的,我們只考慮其中一種即可。如果沒有要求字典序最小的話,則顯然相對位置不變的方案是最優的 那麼我們可以直接得到一種合法方案以及最小代價。我們用xi表示第i個數是往左,往右還是不變,那麼按xi 分段後顯然每一段是獨立的,否則代價一定大了。那麼我們考慮 xi 相同的一段。如果他們都是...