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=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const ll Mod=;
const int N=;
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=;
while(y)
{
if(y&) ans=ans*x%Mod;
x=x*x%Mod;
y>>=;
}
return ans;
}
int main()
{
int i,j;
R(n); R(A); R(B);
Jiec[]=; for(i=;i<=n;i++) Jiec[i]=1ll*Jiec[i-]*i%Mod;
Xins[].W=0x3f3f3f3f;
for(i=;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=,Sec=;
for(i=;i<=n;i++)
{
if(Fir==||Xins[i].W<Xins[Min[Fir]].W) {Sec=Fir; Fir=Xins[i].Cor;}
else if(Sec==||Xins[i].W<Xins[Min[Sec]].W) Sec=Xins[i].Cor;
}
for(i=;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=;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=;
for(i=;i<=n;i++) if(Liantong[i].size())
{
for(j=;j<Liantong[i].size();j++)
{
Cnt[Xins[Liantong[i][j]].Cor]++;
}
ll tmp=Jiec[Liantong[i].size()];
for(j=;j<Liantong[i].size();j++) if(Cnt[Xins[Liantong[i][j]].Cor])
{
tmp=1ll*tmp*Ksm(Jiec[Cnt[Xins[Liantong[i][j]].Cor]],Mod-)%Mod;
Cnt[Xins[Liantong[i][j]].Cor]=;
}
ans=1ll*ans*tmp%Mod;
}
Wl(ans);
return ;
}
/*
input
4 7 3
3 2
4 3
2 1
4 4
output
2 input
5 99 100
5 91
2 42
3 63
3 35
4 21
output
12 input
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
*/

AT2364 Colorful Balls的更多相关文章

  1. noip2019集训测试赛(二十一)Problem A: Colorful Balls

    Problem A: Colorful Balls Description Snuke放了N个一排彩色的球.从左起第i个球的颜色是ci重量是wi她可以通过执行两种操作对这些球重新排序操作1:选择两个相 ...

  2. CF1478-A. Nezzar and Colorful Balls

    CF1478-A. Nezzar and Colorful Balls 题意: 有\(n\)个球,每个球上面都有一个数字\(a_i\),这些数字是组成的序列是非递减的.现在你要给每个球涂色,你必须保证 ...

  3. [AT2364] [agc012_d] Colorful Balls

    题目链接 AtCoder:https://agc012.contest.atcoder.jp/tasks/agc012_d 洛谷:https://www.luogu.org/problemnew/sh ...

  4. 【AtCoder】【组合数学】【模型转换】Colorful Balls(AGC012)

    题意: 有n个球,每个球有两个值,一个是颜色,另一个是重量.可以进行如下的操作任意次: 1.选择两个颜色相同的球,如果这两个球的重量之和小于等于X,就交换这两个球: 2.选择两个颜色不同的球,如果这两 ...

  5. AGC 012 D - Colorful Balls

    题面在这里! 为什么atcoder都是神仙题啊qwq 首先发现如果要让 x,y 互换位置的话,要么通过他们直接换 (也就是x和y满足两种操作之一),要么间接换,通过一些其他的元素形如 x可以和 a[1 ...

  6. [AGC012D]Colorful Balls

    题意:有$N$个球,有颜色$c_i$,重量$w_i$,若($c_a=c_b$且$w_a+w_b\leq X$)或($c_a\ne c_b$且$w_a+w_b\leq Y$),可以交换$a,b$,求总共 ...

  7. AtCoder Grand Contest 012 D:Colorful Balls

    题目传送门:https://agc012.contest.atcoder.jp/tasks/agc012_d 题目翻译 给你一排一共\(N\)个球,每个球有一个颜色\(c_i\)和一个重量\(w_i\ ...

  8. AtCoder Grand Contest 012 D Colorful Balls

    题意: 有N个球排成一行,第i个球颜色为ci, 权为wi, 如果两个同色球权值和 <= X 则它们可以交换: 如果两个异色球权值和 <= Y 则它们可以交换:不限制交换次数,求能到达的颜色 ...

  9. 【AGC 002F】Leftmost Ball

    Description Snuke loves colorful balls. He has a total of N*K balls, K in each of his favorite N col ...

随机推荐

  1. python条件、循环语句

    既然讲到语句,那先说明一下语句块.语句块不是一种语句,是一组语句.在条件为真时执行或者多次的一组语句.主要注意其格式,用冒号来标识语句块的开始,块中每行缩进相同的量,一般4个空格(tab字符位置为8个 ...

  2. Web —— 在自己电脑搭建网站,发布到公网,并使用域名访问

    导读 闲置着一台笔记本,想拿来作为服务器来玩,先拿来发布之前的毕业设计的博客系统,百度搜出的资料玉石难辨,而且大多数前篇一律,刚开始参考了大多数资料来设置还是没能真正发布成功,最后发现原来网上大部分提 ...

  3. ESP8266 wifi钓鱼

    原文链接: https://www.cnblogs.com/xiaowuyi/p/6980072.html https://www.cnblogs.com/xiaowuyi/p/7110652.htm ...

  4. ueditor保存出现 从客户端(Note="<p>12345</p>")中检测到有潜在危险的 Request.Form 值

    检测到有潜在危险的 Request.Form 值   这种问题是因为你提交的Form中有HTML字符串,例如你在TextBox中输入了html标签,或者在页面中使用了HtmlEditor组件等,解决办 ...

  5. UVA11255 Necklace Burnside、组合

    VJ传送门 因为有每种颜色个数的限制,所以不能使用Polya 考虑退一步,使用Burnside引理求解 回忆一下Burnside引理,它需要求的是置换群中每一个置换的不动点个数,也就是施加一次置换之后 ...

  6. UOJ14 DZY Loves Graph 并查集

    传送门 题意:给出一张$N$个点,最开始没有边的图,$M$次操作,操作为加入边(边权为当前的操作编号).删除前$K$大边.撤销前一次操作,每一次操作后询问最小生成树边权和.$N \leq 3 \tim ...

  7. 查看MS Sqlserver文件大小语句

    1..查询数据库的数据文件及日志文件的相关信息(包括文件组.当前文件大小.文件最大值.文件增长设置.文件逻辑名.文件路径等) select * from [数据库名].[dbo].[sysfiles] ...

  8. sklearn学习笔记之简单线性回归

    简单线性回归 线性回归是数据挖掘中的基础算法之一,从某种意义上来说,在学习函数的时候已经开始接触线性回归了,只不过那时候并没有涉及到误差项.线性回归的思想其实就是解一组方程,得到回归函数,不过在出现误 ...

  9. Verilog设计Valid-Ready握手协议

    转自http://ninghechuan.com 我不生产知识,我只是知识的搬运工. Handshake Protocol握手协议!为了保证数据传输过程中准确无误,我们需要加上握手信号来控制信号的传输 ...

  10. SA的一个辣鸡trick

    基础板子 namespace SA{ int x[400010],y[400010],SA[400010],rk[400010],ht[400010],t[400010]; int st[19][40 ...