火凤燎原

火凤燎原

https://ac.nowcoder.com/acm/contest/11219/F

牛啊 这次要快速读入 memset代价太高了 https://www.luogu.com.cn/paste/vg035rgp

问题模型 给定一棵树,求其中蒲公英的个数。

模型分析 对于一个点 uu,假设 uu 的孩子结点有 kk 个,它们分别是 v_{1\cdots k}v 1⋯k ​ ,首先特判掉 k<3k<3 不产生贡献的情况。

然后考虑枚举点 vv 不作为 单点的子树,作为链的起点:

此时这个 vv 对于点 uu 的贡献,是以 vv 为根的子树大小减一(链的长度不少于 22,所以 vv 自己作为链的情况需要去除)。 考虑列出式子:

\begin{aligned}&~~\sum_{foreachv}size[v]-1\=&~~n-1-du[u]\end{aligned}

for each v ∑ ​ size[v]−1 n−1−du[u] ​

其中 size[v]size[v] 表示以 vv 为根的子树大小,du[u]du[u] 表示点 uu 的度。

这个等式就是考虑容斥,把不可能作为“链”的末端的点(所有与 uu 直接相连的点和 uu 本身)去掉即可。

总复杂度 O(n)O(n)。

#include <bits/stdc++.h>
using namespace std;
const int N =2e6+10;
typedef long long ll;
int n,t,u,v;
int a[200006];
ll ans =0;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >>n;
    while(n--){
        for(int i =1;i<=t;i++)a[i]=0;
        cin >>t;
        ans =0;
        for(int i=1;i<t;i++){
            cin >> u>>v;
            a[u]++,a[v]++;
        }
        for(int i =1;i<=t;i++){
            if(a[i]>=3){
                ans+=t-1-a[i];//每个顶点有n-1个子树    -去掉一个点
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
全部评论
你 Markdown & LaTeX 炸了,建议复制下面的源码而非直接复制文本。
点赞 回复 分享
发布于 2022-01-17 10:55

相关推荐

07-03 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
05-12 11:09
已编辑
门头沟学院 后端
已注销:没必要放这么多专业技能的描述。这些应该是默认已会的,写这么多行感觉在凑内容。项目这块感觉再包装包装吧,换个名字,虽然大家的项目基本都是网上套壳的,但是你这也太明显了。放一个业务项目,再放一个技术项目。技术项目,例如中间件的一些扩展和尝试。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
牛客刘北:如果暑期实习是27届的话,你要晚一年才会毕业,企业为什么会等你呢?要搞清时间逻辑呀!27届现在实习只能是在暑假实习,这是日常实习,不是暑期实习。所以多去投日常实习吧,暑期实习肯定不会要你的
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务