51nod2553 雙重祖先

2022-04-30 07:33:15 字數 1063 閱讀 8837

給定兩顆有根樹,兩顆樹均有 \(n\) 個節點,且跟均為 \(1\) 號點

問有多少對 \((u,v)\) 滿足在給定的兩顆樹中 \(u\) 均為 \(v\) 的祖先

先重鏈剖分第一顆樹,處理出剖分序後在第二顆樹上 \(dfs\)

每 \(dfs\) 到乙個點就把其加入第一顆樹對應的剖分序的位置,可以用樹狀陣列維護

那麼假設現在 \(dfs\) 到的點為點 \(x\),那麼其祖先一定都在樹狀陣列中,那麼只要在第一顆樹上查詢 \(x\) 到根上 \(1\) 的個數即可。這裡的 \(1\) 代表著既在第一顆樹上是 \(x\) 的祖先,又在第二顆樹上是 \(x\) 的祖先

#include #include using namespace std;

const int max_n = 1e5 + 10;

void dfs_1(int x);

void dfs_2(int x, int tp);

int n;

long long ans;

int sz[max_n], fa[max_n], son[max_n], dep[max_n], dfn[max_n], top[max_n], pos[max_n], id;

vectore[max_n], g[max_n];

struct bit

int query(int x, int res = 0)

} tr;

int query(int x)

return res;

}void dfs(int x, int lst)

tr.insert(pos[x], -1);

}int main()

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

dfs_1(1);

dfs_2(1, 1);

dfs(1, 0);

printf("%lld\n", ans);

return 0;

}void dfs_1(int x) }}

void dfs_2(int x, int tp)

}}

51Nod 1275 雙指標 雙端佇列

題目鏈結 題意 給定乙個陣列a aa和乙個整數k kk,問有多少個連續區間的最大值和最小值的差不大於kkk 思路 首先對於固定起點的連續區間,隨著終點的增大,其區間最大值一定非遞減,區間最小值一定非遞增,故區間最大值和最小值的差一定是非遞減的。故可以利用雙指標來快速求出合法區間的個數。但該過程還需要...

51nod 貪心入門

有若干個活動,第i個開始時間和結束時間是 si,fi 活動之間不能交疊,要把活動都安排完,至少需要幾個教室?分析 能否按照之一問題的解法,每個教室安排盡可能多的活動,即按結束時間排序,再貪心選擇不衝突的活動,安排乙個教室之後,剩餘的活動再分配乙個教室,繼續貪心選擇 反例 a 1,2 b 1,4 c ...

51nod 迷宮問題

1459 迷宮遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的...