求助,树上前缀和全WA 但是样例过了
查看原帖
求助,树上前缀和全WA 但是样例过了
1110115
chronobox楼主2024/3/18 14:34
#include <bits/stdc++.h>
typedef long long ll;
const int N = 3e5 + 10;
const int mod = 998244353;
int dep[N], f[N][25];
ll val[52], s[N][52];
std::vector<int>e[N];
int n, m;
void dfs(int u) {
    for(int i = 1; i <= 23; i++) {
        f[u][i] = f[f[u][i - 1]][i - 1];
    }
    for(auto v : e[u]) {
        if(v == f[u][0]) continue;
        f[v][0] = u;
        dep[v] = dep[u] + 1;
        for(int i = 1; i <= 50; i++) val[i] = val[i - 1] * dep[v] % mod; //处理深度次方
        for(int i = 1; i <= 50; i++) s[v][i] = (val[i] + s[u][i]) % mod; //类似 s[i] = s[i - 1] + a[i]
        dfs(v);
    }
}
int lca(int u, int v) {
    if(dep[u] < dep[v]) std::swap(u, v);
    int delta = dep[u] - dep[v];
    for(int i = 0; i <= 23 && delta; i++, delta >>= 1) {
        if(delta & 1) {
            u = f[u][i];
        }
    }
    if(u == v) return u;
    for(int  i = 23; i >= 0; i--){
        if(f[u][i] != f[v][i]){
            u = f[u][i];
            v = f[v][i];
        }
    }
    return f[u][0];
}
signed main() {
    std::ios::sync_with_stdio(false);
    std:: cin.tie(0);
    std:: cout.tie(0);
    std:: cin >> n;
    for(int i = 1; i <= n - 1; i++) {
        int u, v;
        std:: cin >> u >> v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    std:: cin >> m;
    val[0] = 1;
    dfs(1);
    while(m--) {
        int u, v, k;
        std:: cin >> u >> v >> k;
        int LCA = lca(u, v);
        std:: cout << (s[u][k] + s[v][k] - s[LCA][k] + s[f[LCA][0]][k] + 2 * mod ) % mod << '\n';
    }
}

2024/3/18 14:34
加载中...