2019牛客暑期多校训练营(第九场)E:All men are brothers

题目链接:https://ac.nowcoder.com/acm/contest/889/E

题意:给出m对朋友关系,朋友关系可以传递,每次给出一对朋友关系后,输出选择四个人两两都不是朋友的不同方案的数目

思路:考虑每次新添入一对朋友对答案得影响,利用组合数学可以得出当前答案,一直更新即可

代码:

#include<bits/stdc++.h>
using namespace std;
 
typedef unsigned long long ll;
 
ll Fa[100100];
ll sz[100100];
void init(int n)
{
    for(int i=1;i<=n;i++){
       Fa[i]=i;
       sz[i]=1;
    }
}
int fid(int x)
{
    if(x==Fa[x]) return x;
    return Fa[x]=fid(Fa[x]);
}
int main()
{
    ll n,m;
    scanf("%lld %lld",&n,&m);
    init(n);
    ll ans=n*(n-1)/2*(n-2)/3*(n-3)/4,s=0;
 
    printf("%llu\n",ans);
    for(int i=1;i<=m;i++){
       int a,b;
       scanf("%d %d",&a,&b);
 
       int fa=fid(a),fb=fid(b);
       if(fa!=fb&&ans!=0){
           s=s-(sz[fa]*(sz[fa]-1)/2+sz[fb]*(sz[fb]-1)/2);
           ll k=n-sz[fa]-sz[fb];
           ans=ans-(k*(k-1))/2*sz[fa]*sz[fb]+sz[fa]*sz[fb]*s;
 
           s=s+(sz[fa]+sz[fb])*(sz[fa]+sz[fb]-1)/2;
           Fa[fa]=fb;
           sz[fb]+=sz[fa];
           printf("%llu\n",ans);
       }
       else {
           printf("%llu\n",ans);
       }
    }
}
全部评论

相关推荐

兄弟们,绩效自评一定得给自己打A啊!千万别谦虚给低分,不然领导正愁给谁高分,你这不就“主动请缨”了嘛,而且多数领导不会给你更高分。我几年前试用期绩效自评打了B,领导就给了同等级,还好是试用期。真别等领导主动给高评价!
准备进厂的劳伦斯很迷人:小学时候有个册子 自评 小组 老师 我谦虚打了个b 小组别人给我打b 老师来句我觉得能给他打a 但是小组长说他自评是b怎么能打高呢 那时候我才明白的道理
点赞 评论 收藏
分享
就用这个吧:支持多益再加一个空气使用费
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务