牛客小白月赛127 E

E-Flower_Rainbow_and_Game_牛客小白月赛127

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

对于所有有父子关系的点 他们的距离和就是 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;
}
相关推荐
装不满的克莱因瓶几秒前
掌握语义分割经典模型 FCN——从像素分类到端到端分割的奠基之作
人工智能·python·深度学习·算法·机器学习·分类·数据挖掘
学计算机的计算基5 分钟前
链表算法上篇:LeetCode 206/234/141/142/160/21 题解与易错点
java·笔记·算法·链表
大白话_NOI9 分钟前
【洛谷 P2678】 [NOIP2015 提高组] 跳石头 超详细题解
c++·算法
xwz小王子12 分钟前
ICRA 2026深度观察:全栈闭环成标配,中国具身智能势力显著崛起
大数据·人工智能·算法
孬甭_13 分钟前
深入解析归并排序:稳定高效的分治典范
算法·排序算法
DXM052121 分钟前
第14期|高阶分割模型:Transformer/SegFormer遥感应用
人工智能·python·神经网络·算法·计算机视觉·cnn·ageo
Kurisu_红莉栖1 小时前
前缀和的另外一种用法,前缀和分解
算法
88号技师1 小时前
2026年2月一区SCI-交叉传播优化算法Propagation Alongside Crossover-附Matlab免费代码
开发语言·算法·数学建模·matlab·优化算法
悠仁さん1 小时前
数据结构 图(代码实现篇 C语言版)
数据结构·算法·图论
aini_lovee1 小时前
多智能体粒子群优化(Multi-Agent Particle Swarm Optimization, MAPSO)
算法