题意:

t组输入,有n个人,刚开始谁也不认识谁。每一个人有一个权值w[i](1<=w[i]<=2),你要挑选3个互相不认识的人组成一个队,且要保证3个人权值之和大于等于5(也就意味着最少要有权值为2的人)

为你能找到多少个满足题意得队伍

然后给你n-1个关系,每个关系输入x y

这表示x和y认识了,而且如果z认识y,那么x也认识z。即关系具有传递性

然后在输出你还能找到多少个满足题意得队伍(这样循环n-1次)

题解:

因为关系有传递性,所以如果x和y认识,我们可以让x所在这个集合和y所在这个集合合并成一个集合,也就是这里用到了并查集

我们开始统计一下权值为1得总人数为cnt1,权值为2得总人数为cnt2

那么最开始n个人都不认识的时候能找到sum个满足题意的队伍,下面算式用排列组合表示:Ccnt23+C2cnt2*cnt1

sum=cnt2*(cnt2-1)*(cnt2-2)/6+cnt2*(cnt2-1)*cnt1/2;

用s1[i]表示第i个集合有s1[i]个人的权值为1

用s2[i]表示第i个集合有s2[i]个人的权值为2

如果x 合并入 y 集合,那么要重新统计一下s1[y]和s2[y],而且一些队伍不能满足题意了,要减去不满足题意得队伍

代码:

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#include <set>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <math.h>
#include<map>
using namespace std;
typedef long long ll;
const int MOD=1e9+7;
const int maxn = 1e5 + 5;
ll v[maxn],w[maxn];
ll n,s[maxn],s2[maxn],cnt1,cnt2,sum;
ll finds(ll x)
{
if(v[x]!=x)
{
ll y=finds(v[x]);
v[x]=y;
return y;
}
return x;
}
void solve(ll x,ll y)
{
ll fx=finds(x);
ll fy=finds(y); sum=sum-(s2[fx]*s2[fy]*(cnt2-s2[fx]-s2[fy])); // 2 2 2,意思:从s2[fx]中选择一个2权值的人,从s2[fy]中选择一个2权值的人,从剩下不再s2[fx]和s2[fy]集合里面,且权值为2的人中选择一个
sum=sum-(s2[fx]*s2[fy]*(cnt1-s[fx]-s[fy])); // 2 2 1
sum=sum-(s2[fx]*s[fy]*(cnt2-s2[fx]-s2[fy])); // 2 1 2
sum=sum-(s[fx]*s2[fy]*(cnt2-s2[fx]-s2[fy])); // 1 2 2 v[fx]=fy;
s[fy]+=s[fx];
s2[fy]+=s2[fx];
printf("%lld\n",sum%MOD);
}
int main()
{
ll t;
scanf("%lld",&t);
while(t--)
{
cnt1=cnt2=sum=0;
memset(s,0,sizeof(s));
memset(s2,0,sizeof(s2));
scanf("%lld",&n);
for(ll i=1;i<=n;++i)
{
v[i]=i;
scanf("%lld",&w[i]);
if(w[i]==1) cnt1++,s[i]++;
else cnt2++,s2[i]++;
}
sum=cnt2*(cnt2-1)*(cnt2-2)/6+cnt2*(cnt2-1)*cnt1/2;
printf("%lld\n",sum%MOD);
for(ll i=1;i<n;++i)
{
ll x,y;
scanf("%lld%lld",&x,&y);
solve(x,y);
} }
return 0;
}

hdu 6795 Little W and Contest 并查集+排列组合的更多相关文章

  1. 2019牛客暑期多校训练营(第九场)E.All men are brothers(并查集+排列组合)

    题意:现在有n个集合 每个集合大小为1 现在你可以把集合合并m次 每次会告诉你哪个集合合并 让你输出每次从不同的四个集合里各选出四个的组合方案 思路:我们可以想到用并查集模拟集合的合并 对于方案数 我 ...

  2. hdu 5458 Stability(树链剖分+并查集)

    Stability Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Total ...

  3. [HDU 3712] Fiolki (带边权并查集+启发式合并)

    [HDU 3712] Fiolki (带边权并查集+启发式合并) 题面 化学家吉丽想要配置一种神奇的药水来拯救世界. 吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[ ...

  4. hdu 3047 Zjnu Stadium(加权并查集)2009 Multi-University Training Contest 14

    题意: 有一个运动场,运动场的坐席是环形的,有1~300共300列座位,每列按有无限个座位计算T_T. 输入: 有多组输入样例,每组样例首行包含两个正整数n, m.分别表示共有n个人,m次操作. 接下 ...

  5. hdu 3635 Dragon Balls(加权并查集)2010 ACM-ICPC Multi-University Training Contest(19)

    这道题说,在很久很久以前,有一个故事.故事的名字叫龙珠.后来,龙珠不知道出了什么问题,从7个变成了n个. 在悟空所在的国家里有n个城市,每个城市有1个龙珠,第i个城市有第i个龙珠. 然后,每经过一段时 ...

  6. hdu 5441 Travel 离线带权并查集

    Travel Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5441 De ...

  7. hdu 5652 India and China Origins 并查集+逆序

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题意:一张n*m个格子的点,0表示可走,1表示堵塞.每个节点都是四方向走.开始输入初始状态方格, ...

  8. 2015多校第6场 HDU 5354 Bipartite Graph CDQ,并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5354 题意:求删去每个点后图是否存在奇环(n,m<=1e5) 解法:很经典的套路,和这题一样:h ...

  9. hdu 1856 More is better (并查集)

    More is better Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 327680/102400 K (Java/Others) ...

随机推荐

  1. Linux应急响应--入侵排查

    1.入侵者可能会删除机器的日志信息,可以查看日志信息是否还存在或者是否被清空,相关命令示例: ll -h /var/log/*  系统日志一般都存在/var/log下常用的系统日志如下:核心启动日志: ...

  2. 腾讯云COS对象存储占据数据容灾C位

    说到公有云容灾,大家首先想到的是云上数据备份. 然而,随着企业核心业务逐渐从线下迁移到云上,客户提出了更高的要求.如何确保云上业务的高可用.数据的高可靠,这对云厂商提出了新的挑战. 腾讯云作为全球领先 ...

  3. SGA: allocation forcing component growth分析

    1.问题现象 20年12月31日,数据库应用人员反映2020-12-31 12:40:10存在告警,过了几分钟之后业务恢复正常. 表现的状态:Connect to database time out, ...

  4. undefined和null区别

    undefined类型只有一个值就是undefined,没有必要显式地声明一个变量为undefined. null类型其实就是一个对象的空指针,所以用typeof null 才会显示为object. ...

  5. springAOP的概述及使用

    Spring AOP SpringAOP是Spring中非常重要的功能模块之一,该模块提供了面向切面编程,在事务处理,日志记录,安全控制等操作中广泛使用. SpringAOP的基本概念 AOP的概念 ...

  6. Sentry(v20.12.1) K8S 云原生架构探索,JavaScript Enriching Events(丰富事件信息)

    系列 Sentry-Go SDK 中文实践指南 一起来刷 Sentry For Go 官方文档之 Enriching Events Snuba:Sentry 新的搜索基础设施(基于 ClickHous ...

  7. 网络基础知识之Cisco

    2021-01-2313:35:21 大家好,我是新手,刚学完Cisco协议,以后,我会每天都会给大家一些学习笔记 和一些学习心得,这方面不会的可以找我.qq2934896930. 网络的定义: 计算 ...

  8. 攻击JWT的一些方法

    JWT安全隐患之绕过访问控制 https://mp.weixin.qq.com/s/xe8vOVhaysmgvxl-A3nkBA 记录一次JWT的越权渗透测试 https://mp.weixin.qq ...

  9. Jackson学习

    Jackson 是一个能够将java对象序列化为JSON字符串,也能够将JSON字符串反序列化为java对象的框架. 本文的所有内容都可以从 Java JSON Jackson Introductio ...

  10. Python爬虫学习笔记(三)

    Cookies: 以抓取https://www.yaozh.com/为例 Test1(不使用cookies): 代码: import urllib.request # 1.添加URL url = &q ...