牛客小白月赛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;
}
相关推荐
ZhengEnCi12 小时前
GPT-6 Astra 爆改 Qwen 权重真有那么神吗:权重空间编程 0.016% 参数的真相
算法·架构
罗西的思考12 小时前
【轻量化复刻大模型 / KIMI K3】KDA(Kimi Delta Attention):并行
人工智能·算法·机器学习
夜不会漫长14 小时前
C++:红黑树
数据结构·算法
AI备案指南-满满15 小时前
算法备案审核不通过,一般是什么原因?
java·人工智能·算法·大模型备案·算法备案·大模型登记
Ramble_Naylor15 小时前
Rust深度解读:Send 与 Sync 的本质与线程安全边界
python·算法·rust
秋天的怀念_David15 小时前
算法一千零一夜 · 第二十三夜 电力民生写成的曲线
java·程序人生·算法
不一样的故事12615 小时前
NB/T 47013.8-2015 附录D 吸枪技术
人工智能·经验分享·算法
通问AI15 小时前
用 200 行 Python 给文档库做「上下文完整度」自检:四个可复算的检查项
算法
揽星河..16 小时前
【C语言】扫雷游戏
c语言·算法·游戏
丘山录16 小时前
本地部署 LongCat-2.5,要 7 台机器我只有 4 台
人工智能·算法