hdu 6795 Little W and Contest 并查集+排列组合
题意:
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 并查集+排列组合的更多相关文章
- 2019牛客暑期多校训练营(第九场)E.All men are brothers(并查集+排列组合)
题意:现在有n个集合 每个集合大小为1 现在你可以把集合合并m次 每次会告诉你哪个集合合并 让你输出每次从不同的四个集合里各选出四个的组合方案 思路:我们可以想到用并查集模拟集合的合并 对于方案数 我 ...
- hdu 5458 Stability(树链剖分+并查集)
Stability Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)Total ...
- [HDU 3712] Fiolki (带边权并查集+启发式合并)
[HDU 3712] Fiolki (带边权并查集+启发式合并) 题面 化学家吉丽想要配置一种神奇的药水来拯救世界. 吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[ ...
- hdu 3047 Zjnu Stadium(加权并查集)2009 Multi-University Training Contest 14
题意: 有一个运动场,运动场的坐席是环形的,有1~300共300列座位,每列按有无限个座位计算T_T. 输入: 有多组输入样例,每组样例首行包含两个正整数n, m.分别表示共有n个人,m次操作. 接下 ...
- hdu 3635 Dragon Balls(加权并查集)2010 ACM-ICPC Multi-University Training Contest(19)
这道题说,在很久很久以前,有一个故事.故事的名字叫龙珠.后来,龙珠不知道出了什么问题,从7个变成了n个. 在悟空所在的国家里有n个城市,每个城市有1个龙珠,第i个城市有第i个龙珠. 然后,每经过一段时 ...
- hdu 5441 Travel 离线带权并查集
Travel Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5441 De ...
- hdu 5652 India and China Origins 并查集+逆序
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题意:一张n*m个格子的点,0表示可走,1表示堵塞.每个节点都是四方向走.开始输入初始状态方格, ...
- 2015多校第6场 HDU 5354 Bipartite Graph CDQ,并查集
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5354 题意:求删去每个点后图是否存在奇环(n,m<=1e5) 解法:很经典的套路,和这题一样:h ...
- hdu 1856 More is better (并查集)
More is better Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 327680/102400 K (Java/Others) ...
随机推荐
- 通过JS逆向ProtoBuf 反反爬思路分享
前言 本文意在记录,在爬虫过程中,我首次遇到Protobuf时的一系列问题和解决问题的思路. 文章编写遵循当时工作的思路,优点:非常详细,缺点:文字冗长,描述不准确 protobuf用在前后端传输,在 ...
- 总结下MySql优化。防止数据灾难的发生。
在PHP开发中用到的数据库中MySql是最牛逼的数据库,没有之一--^_^ 相比Sqlite个人最喜欢的特性就是"支持多线程,充分利用 CPU 资源",不像Sqlite那样,动不动 ...
- 解压rpm文件
rpm2cpio zabbix-2.2.2-0.el6.zbx.src.rpm |cpio -div
- JVM虚拟机基础
JVM 全称Java Virtual Machine,也就是我们耳熟能详的Java 虚拟机.它能识别.class 后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作. Ja ...
- Linux Centos7之由Python2升级到Python3教程
1.先查看当前系统Python版本,默认都是Python2.7,命令如下: [root@localhost gau]# python -V Python 2.7.5 2.安装Python3,安装方法很 ...
- Py基础—变量名,条件循环,空执行,编码,运算符,字符比较,简化写法
变量名 只能是字母,数字,下划线.数字不能开头,不要和python内置的东西重复.赋予变量名内容:name1 = "shit" 输出变量名内容 print(name1) 条件语句 ...
- poj 1038 Bugs Integrated, Inc. 题解
提供一种代码难度比较简单的做法(可能) 状态表示: 设置状态$ f[i][j] $,表示第 \(i\) 行状态为 \(j\) 的最大放置数,因为这是个阴间题,因为题目内存设置很小,所以要用滚动数组,存 ...
- JavaFx ObservableList的使用详解
原文地址:JavaFx ObservableList的使用详解 | Stars-One的杂货小窝 最近在研究MVVM模式,发现可以将之前写的FxRecyclerView控件改造一下,便是开始尝试,尝试 ...
- 对于两个输入文件,即文件A 和文件B ,请编写MapReduce程序,对两个文件进行合并排除其中重复的内容,得到一个新的输出文件C。
package org.apache.hadoop.examples; import java.util.HashMap; import java.io.IOException; import jav ...
- IEEE Standard 754 for Binary Floating-Point Arithmetic
IEEE 754-2008 - IEEE Standard for Floating-Point Arithmetic https://standards.ieee.org/standard/754- ...