BJOI2018 求和 倍增LCA

2022-05-03 19:36:10 字數 2141 閱讀 5919

$master$ 對樹上的求和非常感興趣。他生成了一棵有根樹,並且希望多次詢問這棵樹上一段路徑上所有節點深度的$k$次方和,而且每次的$k$可能是不同的。此處節點深度的定義是這個節點到根的路徑上的邊數。他把這個問題交給了$pupil$,但$pupil$ 並不會這麼複雜的操作,你能幫他解決嗎?

輸入格式:

第一行包含乙個正整數n,表示樹的節點數。

之後n-1行每行兩個空格隔開的正整數i, j ,表示樹上的一條連線點$i$和點$j$的邊。

之後一行乙個正整數m ,表示詢問的數量。

之後每行三個空格隔開的正整數i, j, k,表示詢問從點i到點j的路徑上所有節點深度的k次方和。由於這個結果可能非常大,輸出其對998244353取模的結果。

樹的節點從1開始標號,其中1號節點為樹的根。

輸出格式:

對於每組資料輸出一行乙個正整數表示取模後的結果。

對$k=1...50$全部預處理出來,然後就是lca模板題了

#include

using

namespace

std;

const

long

long maxn = 300000 + 10;

const

long

long mod = 998244353;

long

long n,m,dep[maxn],father[maxn][25],d[maxn][51];

vector

long> edges[maxn];

inline

long

long

quickpow

(long

long x,long

long y)

inline

void

dfs(long

long now,long

long fa)

}inline

void

init

()inline

long

long

lca(long

long a,long

long b)

return father[a][0];

}int

main

() dep[1] = -1;

father[1][0] = 1;

dfs(1,1);

init();

scanf("%lld",&m);

while (m--)

return

0;}

#include

using

namespace

std;

const

long

long maxn = 300000 + 10;

const

long

long mod = 998244353;

long

long n,m,dep[maxn],father[maxn][25],d[maxn][51];

vector

long> edges[maxn];

inline

long

long

quickpow

(long

long x,long

long y)

inline

void

dfs(long

long now,long

long fa)

}inline

void

init

()inline

long

long

lca(long

long a,long

long b)

return father[a][0];

}int

main

() dep[1] = -1;

father[1][0] = 1;

dfs(1,1);

init();

scanf("%lld",&m);

while (m--)

return

0;}

BJOI2018 求和 樹上字首和,LCA

一棵有根樹,並且希望多次詢問這棵樹上一段路徑上所有節點深度的 k 次方和,而且每次的 k 可能是不同的。此處節點深度的定義是這個節點到根的路徑上的邊數。他把這個問題交給了pupil,但pupil並不會這麼複雜的操作,你能幫他解決嗎?對每個次數,預處理樹上字首和即可 include using nam...

BJOI2018 鏈上二次求和

bjoi2018 鏈上二次求和 我說今天上午寫部落格吧。怕自己寫一上午,就決定先寫道題。然後我就調了一上午線段樹。花了2h找到lazy標記沒有清空。我tm清空了有沒有標記沒清空標記本身。又花25min找到某個乘法爆int了。int真的淡疼,要不是longlong自帶巨無霸常數,這輩子都不想用int。...

BJOI2018 治療之雨

有 m 1 個數,第乙個數為 p 每輪 選乙個數 1 再依次選 k 個數 1 要求如果第乙個數 n 不能選它 1 如果第乙個數 0 不能選它 1 如果沒有可選的數,跳過該次選擇 問使得第乙個數 0 的期望步數 n le1500 case le10 設 f i 表示當第乙個數為 i 時期望多少輪變為 ...