AT2364 Colorful Balls

题意翻译

N个球排成一排,第i个球有颜色ci和重量wi。 Snuke每次可以选择两个颜色相同,且重量之和不超过X的球,交换他们的位置。 Snuke每次可以选择两个颜色不同,且重量之和不超过Y的球,交换他们的位置。 问,可以得到多少种不同的颜色序列? 答案取膜1000000007

输入输出样例

输入样例#1:

4 7 3
3 2
4 3
2 1
4 4

输出样例#1:

2

输入样例#2:

1 1 1
1 1

输出样例#2:

1

输入样例#3:

21 77 68
16 73
16 99
19 66
2 87
2 16
7 17
10 36
10 68
2 38
10 74
13 55
21 21
3 7
12 41
13 88
18 6
2 12
13 87
1 9
2 27
13 15

输出样例#3:

129729600

sol:较容易的,可以发现如果a和b可以交换,b和c可以交换,那么a和c一定可以交换。

于是可以缩成一个个连通块,把每个连通块中的方案数乘起来就是答案了。对于每个块,令块大小为B,每种颜色的个数分别为b1,b2,b3,...bn,那么答案就是B! / b1! / b2! / ... / bn!

实现恶心的一匹,我用了并查集(应该可以用别的)码量感觉挺大的,但是有些人打的超短,不知道为什么qaq(我太菜菜菜菜菜菜菜菜菜菜菜菜菜了)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{ll s=0;bool f=0;char ch=' ';while(!isdigit(ch)){f|=(ch=='-'); ch=getchar();}while(isdigit(ch)){s=(s<<3)+(s<<1)+(ch^48); ch=getchar();}return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{if(x<0){putchar('-'); x=-x;}if(x<10){putchar(x+'0');    return;}write(x/10);putchar((x%10)+'0');return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const ll Mod=1000000007;
const int N=200005;
int n,A,B;
ll Jiec[N];
int Father[N];
int Min[N],CMin[N];
int Cnt[N];
struct Record
{int Cor,W,Id;
}Xins[N];
inline int Get_Father(int x)
{return (Father[x]==x)?(x):(Father[x]=Get_Father(Father[x]));
}
inline void Merge(int x,int y)
{Father[Get_Father(x)]=Get_Father(y);
}
vector<int>Liantong[N];
inline ll Ksm(ll x,ll y)
{ll ans=1;while(y){if(y&1) ans=ans*x%Mod;x=x*x%Mod;y>>=1;}return ans;
}
int main()
{int i,j;R(n); R(A); R(B);Jiec[0]=1; for(i=1;i<=n;i++) Jiec[i]=1ll*Jiec[i-1]*i%Mod;Xins[0].W=0x3f3f3f3f;for(i=1;i<=n;i++){Father[i]=i;R(Xins[i].Cor); R(Xins[i].W); Xins[i].Id=i;if(Xins[i].W<=Xins[Min[Xins[i].Cor]].W){CMin[Xins[i].Cor]=Min[Xins[i].Cor];Min[Xins[i].Cor]=i;}else if(Xins[i].W<Xins[CMin[Xins[i].Cor]].W){CMin[Xins[i].Cor]=i;}}int Fir=0,Sec=0;for(i=1;i<=n;i++){if(Fir==0||Xins[i].W<Xins[Min[Fir]].W) {Sec=Fir; Fir=Xins[i].Cor;}else if(Sec==0||Xins[i].W<Xins[Min[Sec]].W) Sec=Xins[i].Cor;}for(i=1;i<=n;i++){if(Xins[i].W+Xins[Min[Xins[i].Cor]].W<=A){if(i!=Min[Xins[i].Cor]) Merge(i,Min[Xins[i].Cor]);}if(Xins[i].Cor==Fir){if(Xins[i].W+Xins[Min[Sec]].W<=B) Merge(i,Min[Sec]);}else{if(Xins[i].W+Xins[Min[Fir]].W<=B) Merge(i,Min[Fir]);}}for(i=1;i<=n;i++) Liantong[Get_Father(i)].push_back(i);
//    for(i=1;i<=n;i++) if(Liantong[i].size())
//    {
//        for(j=0;j<Liantong[i].size();j++) W(Liantong[i][j]);
//        puts("");
//    }ll ans=1;for(i=1;i<=n;i++) if(Liantong[i].size()){for(j=0;j<Liantong[i].size();j++){Cnt[Xins[Liantong[i][j]].Cor]++;}ll tmp=Jiec[Liantong[i].size()];for(j=0;j<Liantong[i].size();j++) if(Cnt[Xins[Liantong[i][j]].Cor]){tmp=1ll*tmp*Ksm(Jiec[Cnt[Xins[Liantong[i][j]].Cor]],Mod-2)%Mod;Cnt[Xins[Liantong[i][j]].Cor]=0;}ans=1ll*ans*tmp%Mod;}Wl(ans);return 0;
}
/*
input
4 7 3
3 2
4 3
2 1
4 4
output
2input
5 99 100
5 91
2 42
3 63
3 35
4 21
output
12input
21 77 68
16 73
16 99
19 66
2 87
2 16
7 17
10 36
10 68
2 38
10 74
13 55
21 21
3 7
12 41
13 88
18 6
2 12
13 87
1 9
2 27
13 15
output
129729600
*/

View Code

转载于:https://www.cnblogs.com/gaojunonly1/p/10629259.html

AT2364 Colorful Balls相关推荐

  1. AGC012D - Colorful Balls(并查集)

    AGC012D - Colorful Balls Solution 连边题. 找出www最小的球yyy和www最小且颜色和yyy不同的球zzz. yyy向所有colt≠coly,wt+wy≤Ycol ...

  2. CF1478A - Nezzar and Colorful Ball(数学)

    CF1478A - Nezzar and Colorful Balls Solution 真不戳,这AAA题真不戳,我直接好家伙. 讲一下我搞了半个小时的垃圾做法 (好吧后来看了看标算好像和我是一样的 ...

  3. Codeforces Round #698 (Div. 2)(A ~ F)6题全,超高质量题解)【每日亿题】2021/2/4

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 [每日亿题]Codeforces Round #698 (Div. 2)(A ~ F)6题全,超 ...

  4. [CF/AT/Luogu]各大网站网赛 爆肝部部长工作报告文件Ⅱ

    文章目录 CodeForces LATOKEN-Round-1(Div.1+Div.2) A. Colour the Flag B. Histogram Ugliness C. Little Alaw ...

  5. Codeforces Round #698 (Div. 2) A-E解题报告与解法证明

    Codeforces Round #698 (Div. 2) A-E解题报告与解法证明 题目解法总体概括 A Nezzar and Colorful Balls #include <bits/s ...

  6. Codeforces Round #698 (Div. 2) (思维)

    A. Nezzar and Colorful Balls 题意:给你一个非递减序列的球,现在要给每个球涂色,要求每种颜色的球的值是单调递增的,问最少用多少种颜色 解题思路:根据题意,我们不难看出相同权 ...

  7. 例题6-6 小球下落(Dropping Balls, UVa 679)

    例题6-6 小球下落(Dropping Balls, UVa 679) 许多的小球一个一个的从一棵满二叉树上掉下来组成一个新满二叉树,每一时间,一个正在下降的球第一个访问的是非叶子节点.然后继续下降时 ...

  8. make life colorful

    要善于在生活当中发现快乐.寻找快乐.             Make our life more colorful! 转载于:https://www.cnblogs.com/xinqqing83/a ...

  9. AC日记——Red and Blue Balls codeforces 399b

    399B - Red and Blue Balls 思路: 惊讶的发现,所有的蓝球的消除都是独立的: 对于在栈中深度为i的蓝球消除需要2^i次操作: 代码: #include <cstdio&g ...

最新文章

  1. 异步请求之XMLHttpRequest篇
  2. 干货丨一文读懂深度学习与机器学习的差异
  3. [IE9] 如何让你的网站在IE9和Win7任务栏上更闪亮
  4. json execel xml 互转
  5. VC++设置软件断点和“XXX已停止工作“对话框
  6. PAT_B_1059_Java(14分)_C++(20分)
  7. 新手必须掌握的学车技巧-上坡起步
  8. 我的GitHub Blog开通了
  9. 穿透还原12.1新变种病毒样本
  10. duet连win10_该来的总算来了——Apogee Duet全新Windows 10操作指南
  11. 惠普重新定义IT基础设施
  12. 移动端H5上传图片裁剪
  13. 超火的快闪文字视频制作,用这个软件就能轻松学会
  14. 什么是资本运营的核心?
  15. 聚光灯效应:为什么没有人记得你做过什么
  16. 毁三观:从 onSavedInstanceState 中取值竟为空?!
  17. openEuler虚拟机配置yum源
  18. 报错Failed to resolve component: tree-item at <Tree onVnodeUnmounted=fn<onVnodeUnmounted> ref=Ref< n
  19. 解决uniapp ios手机端获取时间戳出现NAN
  20. 【设计模式】工厂模式(Factory Pattern)

热门文章

  1. Docker基础(2)——基础操作
  2. Mysql 如何通过binlog日志恢复数据
  3. 1090. Highest Price in Supply Chain (25) dfs
  4. android 自定义View 的详细介绍
  5. 从veth看虚拟网络设备的qdisc
  6. sybase修改密码
  7. 发布虚拟机WEB服务 备忘
  8. 软件测试 学习之路 计算机基础
  9. 可替换元素和非替换元素
  10. 大一计算机专业,大一计算机专业学生