题意:

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. 【C++】《C++ Primer 》第十四章

    第十四章 重载运算与类型转换 一.基本概念 重载运算符是具有特殊名字的函数:由关键字operator和其后要定义的运算符号共同组成.也包含返回类型.参数列表以及函数体. 当一个重载的运算符是成员函数时 ...

  2. 网络之HTTPS

    文章目录 HTTPS的基本概念 HTTP和HTTPS的区别 HTTPS的优点 对称加密和非对称加密 对称加密 非对称加密 HTTPS采用的加密方式 认证 证书的组成 使用openssl怎么制造证书 H ...

  3. Ubuntu 18.04.4 LTS 更换国内系统源

    Ubuntu 18.04.4 LTS 更换国内系统源 1.1) 好习惯先做备份在干活: mv /etc/apt/sources.list /etc/apt/sources.list.bak 1.2) ...

  4. fsutil比较有用的几个命令

    Fsutil:fsinfo 主要由专业支持者使用.列出所有驱动器,查询驱动器类型,查询卷信息,查询特定的 卷信息或文件系统统计信息. 语法参数 drives 列出计算机中所有的驱动器. drivety ...

  5. RocketMQ—消息队列入门

    消息队列功能介绍 字面上说的消息队列是数据结构中"先进先出"的一种数据结构,但是如果要求消除单点故障,保证消息传输可靠性,应对大流量的冲击,对消息队列的要求就很高了.现在互联网的& ...

  6. MySQL下载与安装教程

    一,下载篇 1,首先访问MySQL官网下载页,https://dev.mysql.com/downloads/mysql/ 如果是MAC系统,操作系统请选择macOS,Windows则选择Window ...

  7. Spring入门及IoC的概念

    Spring入门 Spring是一个轻量级的Java开发框架,最早由Robd Johnson创建,目的为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题,它是一个分层的JavaSE/EE轻量级开源 ...

  8. 简单监控liunx中cpu、内存、磁盘及发送邮件参考

    shell脚本 vim jk.sh  #命名脚本名   #!/bin/bash time=`date "+%Y-%m-%d %H:%M:%S"`      #定义时间 echo & ...

  9. 关于Java客户端连接虚拟机中的Kafka时,无法发送、接收消息的问题

    kafka通过控制台模拟消息发送和消息接收正常,但是通过javaAPI操作生产者发送消息不成功 消费者接收不到数据解决方案? 1.问题排查 (1)首先通过在服务器上使用命令行来模拟生产.消费数据,发现 ...

  10. Enabling Session Persistence 粘性会话

    NGINX Docs | HTTP Load Balancing https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-ba ...