求问要娶一个什么样的标题才能有人能进来?
查看原帖
求问要娶一个什么样的标题才能有人能进来?
1114241
vectorxyz楼主2024/8/27 10:57

恭喜你,被骗进来了

求条,0pts WA+RE,样例过了

#include <bits/stdc++.h>
#define mod 998244353
using namespace std;
const int N = 1e5 + 5;
vector<int> g[N];
int _, dep[N], fa[N], sz[N], top[N], id[N], a[N], son[N], ans[N];
struct node
{
    int l, r;
    long long sum[55];
}tr[N << 2];
void build(int u, int l, int r)
{   
    tr[u] = {l, r};
    if(l == r)
    {
        for(int i = 1;i <= 50;i ++ ){
            tr[u].sum[i] = pow(a[l], i);
            tr[u].sum[i] %= mod;
        }
        return ;
    }
    int mid = (l + r) / 2;
    build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
    for(int i = 1;i <= 50;i ++ ){
        tr[u].sum[i] = tr[u << 1].sum[i] + tr[u << 1 | 1].sum[i];
        tr[u].sum[i] %= mod;
    }
}
long long query(int u, int l, int r, int k)
{
    if(l <= tr[u].l && tr[u].r <= r){
        return tr[u].sum[k];
    }
    int mid = (tr[u].l + tr[u].r) / 2;
    long long res = 0;
    if(l <= mid) res += (query(u << 1, l, r, k)) % mod;
    if(r >  mid) res += (query(u << 1 | 1, l, r, k)) % mod;
    return res % mod;
}
void dfs1(int u, int f, int deep){
    dep[u] = deep;
    fa[u] = f;
    sz[u] = 1;
    int maxn = -1;
    for(int i = 0;i < g[u].size();i ++ ){
        int v = g[u][i];
        if(v == f) continue;
        dfs1(v, u, deep + 1);
        sz[u] += sz[v];
        if(sz[v] > maxn){
            maxn = sz[v];
            son[u] = v;
        }
    }
}
void dfs2(int u, int topf)
{
    top[u] = topf;
    id[u] = ++_;
    a[_] = dep[u] - 1;
    if(!son[u]) return ;
    dfs2(son[u], topf);
    for(int i = 0;i < g[u].size();i ++ ){
        int v = g[u][i];
        if(v == fa[u] || v == son[u]) continue;
        dfs2(v, v);
    }
}
long long Q(int x,int y, int k)
{
    long long res = 0;
    while(top[x] != top[y]){
        if(dep[top[x]] < dep[top[y]]) swap(x, y);
        res += query(1, id[top[x]], id[x], k);
        x = fa[top[x]];
    }
    if(dep[x] > dep[y]) swap(x, y);
    res += query(1, id[x], id[y], k);
    return res;
}
int main()
{
    int n; cin >> n;
    for(int i = 1;i < n;i ++ ){
        int u, v; cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    dfs1(1, 0, 1), dfs2(1, 1);
    build(1, 1, n);
    // cout << tr[1].sum[5] << endl;
    int m; cin >> m;
    while(m -- ) {
        int i, j, k;cin >> i >> j >> k;
        cout << Q(i, j, k) << endl;
    }
    return 0;
}
2024/8/27 10:57
加载中...