牛客小白月赛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;
}
相关推荐
wangjialelele32 分钟前
平衡二叉搜索树:AVL树和红黑树
java·c语言·开发语言·数据结构·c++·算法·深度优先
驱动探索者1 小时前
linux mailbox 学习
linux·学习·算法
ringking1231 小时前
autoware-1:安装环境cuda/cudnn/tensorRT库函数的判断
人工智能·算法·机器学习
大闲在人1 小时前
8. 供应链与制造过程术语:产能
算法·制造·供应链管理·智能制造·工业工程
一只小小的芙厨2 小时前
寒假集训笔记·以点为对象的树形DP
c++·算法
历程里程碑2 小时前
普通数组----合并区间
java·数据结构·python·算法·leetcode·职场和发展·tornado
执风挽^2 小时前
Python基础编程题2
开发语言·python·算法·visual studio code
Z9fish2 小时前
sse哈工大C语言编程练习20
c语言·开发语言·算法
晓13132 小时前
第六章 【C语言篇:结构体&位运算】 结构体、位运算全面解析
c语言·算法
iAkuya2 小时前
(leetcode)力扣100 61分割回文串(回溯,动归)
算法·leetcode·职场和发展