牛客小白月赛127 E

E-Flower_Rainbow_and_Game_牛客小白月赛127

这个题我们可以先算出所有点对之间的距离 然后将所有含有父子关系的点对的距离减去 然后加1 也就是代价变为1 对于所有点对的距离和 我们可以计算每条边的贡献 每条边被遍历的次数和就是所有点对的距离和 那么对于u 和 v 他们之间的边被遍历的次数就等于size[v]*(n-size[v]) 累加即可

对于所有有父子关系的点 他们的距离和就是 v的所有子节点的深度和-v的子节点的数目*父节点的深度

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
    int n;cin>>n;
    vector<vector<int>>e(n+1);
    for(int i=1;i<n;i++){
        int u,v;cin>>u>>v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    long long ans=0;
    vector<int> sz(n+1,1),dep(n+1);
    auto dfs=[&](auto &&self,int u,int f)->void{
        for(auto v:e[u]){
            if(v!=f){
                dep[v]=dep[u]+1;
                self(self,v,u);
                ans+=sz[v]*(n-sz[v]);
                sz[u]+=sz[v];
            }
        }
    };
    dfs(dfs,1,0);
    vector<int>s=dep;
    auto dfs2=[&](auto &&self,int u,int p)->void{
        for(auto v:e[u]){
            if(v!=p){
                self(self,v,u);
                s[u]+=s[v];
                ans-=s[v]-dep[u]*sz[v];
                ans+=sz[v];
            }
        }
    };
    dfs2(dfs2,1,0);
    cout<< ans % 998244353<<'\n';
}
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t;cin>>t;
    while(t--)solve();
    return 0;
}
相关推荐
Ivanqhz13 小时前
图着色寄存器分配算法(Graph Coloring)
开发语言·javascript·python·算法·蓝桥杯·rust
Elsa️74613 小时前
洛谷p5718 复习下快速排序和堆排序
数据结构·算法·排序算法
Frostnova丶13 小时前
LeetCode 3567.子矩阵的最小绝对差
算法·leetcode·矩阵
夏日听雨眠13 小时前
文件学习9
数据结构·学习·算法
华农DrLai13 小时前
什么是自动Prompt优化?为什么需要算法来寻找最佳提示词?
人工智能·算法·llm·nlp·prompt·llama
黎阳之光13 小时前
十五五智赋新程 黎阳之光以AI硬核技术筑造产业数智底座
大数据·人工智能·算法·安全·数字孪生
2401_8914821713 小时前
C++中的原型模式
开发语言·c++·算法
皙然13 小时前
深度解析三色标记算法:JVM 并发 GC 的核心底层逻辑
java·jvm·算法
sali-tec13 小时前
C# 基于OpenCv的视觉工作流-章40-特征找图
图像处理·人工智能·opencv·算法·计算机视觉
wearegogog12313 小时前
毫米波MIMO系统仿真中混合预编码的交替最小化算法
算法·预编码算法