Problem A: Colorful Balls

Description

Snuke放了N个一排彩色的球.从左起第i个球的颜色是ci重量是wi
她可以通过执行两种操作对这些球重新排序
操作1:选择两个相同颜色的球,假如他们的重量和小于等于X,交换两个球的位置
操作2:选择两个不同颜色的球,假如他们的重量和小于等于Y,交换两个球的位置
求我们总共可以得到多少种 不同的颜色序列?对答案取109+7的模

Input

N X Y
c1 w1
.
.
.
cN wN

Output

输出答案。

Sample Input

sample input 1:
4 7 3
3 2
4 3
2 1
4 4
sample input 2:
1 1 1
1 1
sample input 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

Sample Output

sample output 1:
2
sample output 2:
1
sample output 3:
129729600

HINT

1≤N≤2×105

1≤X,Y≤109
1≤ci≤N
1≤wi≤109

分析

首先,如果球A可以和球B交换,球B也可以和球C交换,那么肯定可以通过球B将球A与球C交换。

所以只需要将可以交换的任意两个球之间连一条边,找出每个联通块中每种球颜色的个数,因为每个联通块内无论怎么排都行,所以就能用组合数求出当前那个联通块中合法排列的方案数,最后再将所有的联通块的方案数乘起来就能得到答案了。

但这种方法的时间复杂度是O(n2)的。

但我们可以设:

球a是全部球中重量最小的球。

球b是全部球中与球a不同色且重量最小的球。

若找不出球b,则只有一种颜色的球,故只有1种方案

若球a与球b不在同一个联通块内,则不可能出现两种不同颜色的球在同一个联通块内,故只有1种方案

而对于每一个球来说,如果它既不能连到球a,也不能连到球b,那么它不可能再连到其他异色的球。

所以只可能有1个联通块对答案做出贡献。

所以我们只需要求出所有可以连到球a或球b或连到一个与它同色且能连到球a或球b的球即可。

时间复杂度为O(n)

O(n)的时间求组合数详见欧拉定理

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct data{
long long x,y;
}t[];
long long n,s1,s2,k1,k2,f[],k[],m=,s[],cnt,id[],sum,ans=,col[],colmax[];
bool d[],r[];
bool cmp(data a,data b){
return a.y<b.y;
}
long long get_pow(long long a,long long b){
long long p=;
while(b){
if(b%)p=(p*a)%m;
a=(a*a)%m;
b=b/;
}
return p;
}
long long c(long long a,long long b){
return (((k[a]*f[b])%m)*f[a-b])%m;
}
void add(long long a){
long long p=a;
while(t[col[p]].y+t[a].y<=s1){
if(!col[p])break;
s[t[a].x]++;
sum++;
p=col[p];
r[p]=;
}
}
int main(){
scanf("%lld%lld%lld",&n,&s1,&s2);
k[]=;
for(long long i=;i<=n;i++)k[i]=(k[i-]*i)%m;
f[n]=get_pow(k[n],m-);
for(long long i=n-;i>;i--)f[i]=(f[i+]*(i+))%m;
f[]=;
f[]=;
for(long long i=;i<=n;i++)scanf("%lld%lld",&t[i].x,&t[i].y);
sort(t+,t+n+,cmp);
for(long long i=;i<=n;i++){
col[colmax[t[i].x]]=i;
colmax[t[i].x]=i;
}
k1=;
k2=;
while(k2<=n&&t[k2].x==t[k1].x)k2++;
if(k2!=n+){
if(t[k1].y+t[k2].y<=s2){
for(long long i=;i<=n;i++){
if((t[i].x!=t[k1].x&&t[k1].y+t[i].y<=s2)||(t[i].x!=t[k2].x&&t[k2].y+t[i].y<=s2)){
if(!d[t[i].x]){
d[t[i].x]=;
r[i]=;
cnt++;
id[cnt]=t[i].x;
s[t[i].x]++;
sum++;
add(i);
}else if(!r[i]){
s[t[i].x]++;
r[i]=;
sum++;
}
}
}
for(long long i=;i<=cnt;i++){
ans=(ans*c(sum,s[id[i]]))%m;
sum=sum-s[id[i]];
}
}
}
printf("%lld\n",ans);
}

  

noip2019集训测试赛(二十一)Problem A: Colorful Balls的更多相关文章

  1. noip2019集训测试赛(二十一)Problem B: 红蓝树

    noip2019集训测试赛(二十一)Problem B: 红蓝树 Description 有一棵N个点,顶点标号为1到N的树.N−1条边中的第i条边连接顶点ai和bi.每条边在初始时被染成蓝色.高桥君 ...

  2. noip2017集训测试赛(十一)Problem C: 循环移位

    题面 Description 给定一个字符串 ss .现在问你有多少个本质不同的 ss 的子串 t=t1t2⋯tm(m>0)t=t1t2⋯tm(m>0) 使得将 tt 循环左移一位后变成的 ...

  3. 2016北京集训测试赛(十一)Problem C: 树链问题

    Solution 智障暴力题, 每个点维护一下子树信息, 树剖就好了. 我居然还傻了写了一发毛毛虫... #include <cstdio> #include <cctype> ...

  4. 题解和总结——noip2019集训测试赛(一)贪吃蛇+字符串+都城

    Problem A: 贪吃蛇 描述 Input Output Sample Input [样例输入1] 4 5 ##... ..1#@ 432#. ...#. [样例输出1] 4 [样例输入2] 4 ...

  5. 2016集训测试赛(二十一)Problem C: 虫子

    题目大意 给你一棵树, 每个点有一个点权. 有两种操作: link / cut 修改某个点的点权 每次操作后, 你要输出以下答案: 在整棵树中任意选两个点, 这两个点的LCA的期望权值. Soluti ...

  6. 2016集训测试赛(二十六)Problem A: bar

    Solution 首先审清题意, 这里要求的是子串而不是子序列... 我们考虑用1表示p, -1表示j. 用sum[i]表示字符串前\(i\)的前缀和. 则我们考虑一个字符串\([L, R]\)有什么 ...

  7. 2016集训测试赛(二十四)Problem B: Prz

    Solution 这道题有两个关键点: 如何找到以原串某一个位置为结尾的某个子序列的最晚出现位置 如何找到原串中某个位置之前的所有数字的最晚出现位置中的最大值 第一个关键点: 我们注意到每个数字在\( ...

  8. 2016集训测试赛(二十四)Problem C: 棋盘控制

    Solution 场上的想法(显然是错的)是这样的: 我们假设棋子是一个一个地放置的, 考虑在放置棋子的过程中可能出现哪些状态. 我们令有序整数对\((i, j)\)表示总共控制了\(i\)行\(j\ ...

  9. 2016集训测试赛(二十)Problem B: 字典树

    题目大意 你们自己感受一下原题的画风... 我怀疑出题人当年就是语文爆零的 下面复述一下出题人的意思: 操作1: 给你一个点集, 要你在trie上找到所有这样的点, 满足点集中存在某个点所表示的字符串 ...

随机推荐

  1. [ARIA] aria-describedby & aria-labelledby

    When to use describedby: For example you have a close button: <button aria-describedby="clos ...

  2. Windows本机调试内部组件

    将详细分析Windows调试的本机接口.希望读者对C和通用NT内核体系结构和语义有一些基本的了解.此外,这并不是介绍什么是调试或如何编写调试器.它可以作为经验丰富的调试器编写人员或好奇的安全专家的参考 ...

  3. PostGraphile 4.4 发布,支持real time 查询

    在4.4 之前,real time 是通过插件完成处理的,4.4 直接内置了,还是很方便的功能,总算 和其他类似graphql 平台看齐了,使用上还是挺方便的. 参考资料 https://www.gr ...

  4. JQuery/JS插件 日期插件

    用于日期的计算,功能比较全,我常用的主要是日期的计算(多一天少一天,或者添加几个月等),日期格式化 网址:http://momentjs.cn/ 测试代码: <!DOCTYPE html> ...

  5. CF 768B

    CF 768B题意:In each operation Sam must remove any element x, such that x>1, from the list and inser ...

  6. 66、Spark Streaming:数据处理原理剖析与源码分析(block与batch关系透彻解析)

    一.数据处理原理剖析 每隔我们设置的batch interval 的time,就去找ReceiverTracker,将其中的,从上次划分batch的时间,到目前为止的这个batch interval ...

  7. 2016级移动应用开发在线测试13-Location、Sensor & Network

    有趣有内涵的文章第一时间送达! 喝酒I创作I分享 生活中总有些东西值得分享 @醉翁猫咪  1. 充分利用智能手机的GPS定位信息,创造了O2O的商业模式,打通了线上与线下的信息流和商流,极大地推动了移 ...

  8. GoCN每日新闻(2019-10-17)

    GoCN每日新闻(2019-10-17) 通过go module管理go tool https://marcofranssen.nl/manage-go-tools-via-go-modules/ 使 ...

  9. 卷积神经网络CNN学习笔记

    CNN的基本结构包括两层: 特征提取层:每个神经元的输入与前一层的局部接受域相连,并提取该局部的特征.一旦该局部特征被提取后,它与其它特征间的位置关系也随之确定下来: 特征映射层:网络的每个计算层由多 ...

  10. 【2019.11.20】SDN上机第4次作业

    安装OpenDayLight控制器 配置JAVA环境 https://www.opendaylight.org/ 在官网进行下载OpenDayLight控制器 启动OpenDayLight控制器和安装 ...