\(Description:\)

给一个序列,每个数有一个颜色c,权值w,不同颜色的若w和小于等于B可交换,相同颜色若w和小于等于A可交换,求最后的序列可能的个数,对1e9+7取模。(相同颜色不同权值算同一种)

\(Sample\) \(Input\):

4 7 3

3 2

4 3

2 1

4 4

\(Sample\) \(Output\):

2

简化一下题目,发现其实是先求出最大联通块的大小,设这个联通块大小为s,颜色相同的点的个数为x,那么答案就是\(A_{s}^{s-x}\),A是排列数,那么考虑怎么求出最大联通块的大小,可以计每个颜色的最小权值,在计一个全局最小权值,如果全局最小可以和颜色最小连边,就连边。

一开始先处理出每个颜色的可以和该颜色最小值连边的所有点,更新这个颜色的联通块大小。

但要注意,如果该颜色是全局最小值的颜色的话,不能直接跟全局最小值加起来比较,还要考虑,他和其他次小元素的和是否可以跨颜色连边。

然后把所有最小值尝试和全局最小值连边,更新s。

在更新答案,(注意逆元问题)

然后就差不多结束了^_^

#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#define int long long
using namespace std;
int n,m,cnt,Min_all,A,B,ans,ss,num;
const int MAXN=1e6;
const int OO=0x3f3f3f3f;
const int p=1e9+7;
int size[MAXN+10];
int c[MAXN+10],w[MAXN+10];
vector <int> v[MAXN+10];
int fac[MAXN+10],inv[MAXN+10];
int bac[MAXN+10],Min[MAXN+10];
int _bac[MAXN+10];
inline int Inv(int a,int b,int p){int ret=1;for(;b;a=(a*a)%p,b>>=1)if(b&1)ret=(ret*a)%p;return ret;
}
signed main(){if(fopen("keep.in","r")){freopen("keep.in","r",stdin);freopen("keep.out","w",stdout);}scanf("%lld%lld%lld",&n,&A,&B);for(int i=1;i<=n;++i)Min[i]=i;fac[0]=fac[1]=1;for(int i=2;i<=n;++i)fac[i]=(fac[i-1]*i)%p;inv[n]=Inv(fac[n],p-2,p)%p;inv[0]=inv[1]=1;for(int i=n-1;i>=2;--i)inv[i]=(inv[i+1]*(i+1))%p;for(int i=1;i<=n;++i)scanf("%lld%lld",&c[i],&w[i]);for(int i=1;i<=n;++i){if(!bac[c[i]])bac[c[i]]=++cnt,_bac[cnt]=c[i];v[bac[c[i]]].push_back(i);}for(int i=1;i<=cnt;++i)for(int j=0;j<(int)v[i].size();++j){if(j==0)Min[i]=v[i][j];elseMin[i]=(w[Min[i]]>w[v[i][j]])?v[i][j]:Min[i];}for(int i=1;i<=cnt;++i)size[Min[i]]=(int)v[i].size();Min_all=Min[1];for(int i=2;i<=cnt;++i)Min_all=(w[Min_all]>w[Min[i]])?Min[i]:Min_all;ss=OO;for(int i=1;i<=cnt;++i){if(Min_all==Min[i])continue;ss=min(ss,w[Min[i]]);}for(int i=1;i<=cnt;++i)for(int j=0;j<(int)v[i].size();++j){if(Min[i]!=v[i][j] && w[Min[i]]+w[v[i][j]]<=A)continue;if(c[Min_all]!=_bac[i] && w[v[i][j]]+w[Min_all]<=B)continue;if(c[Min_all]==_bac[i] && w[v[i][j]]+ss<=B)continue;size[Min[i]]--;}num=size[Min_all];for(int i=1;i<=cnt;++i){if(Min_all==Min[i])continue;if(w[Min[i]]+w[Min_all]<=B)num+=size[Min[i]];}ans=1;for(int i=1;i<=cnt;++i){if(w[Min[i]]+w[Min_all]<=B || Min_all==Min[i])ans=(ans*inv[size[Min[i]]])%p;}ans=(ans*fac[num])%p;printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/JCNL666/p/10634986.html

【题解】 SP5973 SELTEAM - Selecting Teams相关推荐

  1. 5月全球CTF比赛时间汇总来了!

    ● 5月全球CTF比赛时间汇总来了! ● 从事网络安全行业工作,怎么能不参加一次CTF比赛了! 小编作为一个CTF比赛老鸟,以每次都能做出签到题为荣! 下面给大家分享一下5月份CTF比赛时间,比赛按时 ...

  2. Codeforces Round #552 (Div. 3)D、E题解

    D. Walking Robot 题意 机器人在一维坐标轴上从0走到x,中途可以在有光的地方可以选择给太阳能电池充电,每次移动都要消耗一单位电,蓄电池容量为a,太阳能电池容量为b,一开始都是满电,问机 ...

  3. 牛客竞赛,GDDU第十届文远知行杯新生程序设计竞赛,摸鱼记(BDEIKL题解,补G,ACFHJ)

    碎碎念 比赛前看到评论区的提问 这个是干啥的,求解答,第一次参加 抽奖送牛客卫衣的 hhhh重在参与 然后[注意事项]里面写的 1 参赛形式:个人,面向零基础20级新生和部分有基础新生. 4 请各位教 ...

  4. Educational Codeforces Round 9 B. Alice, Bob, Two Teams 前缀和

    B. Alice, Bob, Two Teams 题目连接: http://www.codeforces.com/contest/632/problem/B Description Alice and ...

  5. 微软teams软件_如何在Microsoft Teams中创建和管理团队

    微软teams软件 With its friendly user interface, seamless integration with Office 365, and low price tag, ...

  6. Programming Contest Ranking(题解)

    Programming Contest Ranking . 题目描述 Heilongjiang Programming Contest will end successfully! And your ...

  7. 微软teams软件_如何在Microsoft Teams中创建快速投票

    微软teams软件 Perhaps you want to know your team's opinion on something. Or, maybe you need your coworke ...

  8. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  9. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

最新文章

  1. 让div margin属性消失_margin 和 padding
  2. Redis支持的数据类型以及使用场景,持久化,哨兵机制,缓存击穿,缓存穿透
  3. elementui 弹窗 显示详细信息_ElementUI中el-table双击单元格事件并获取指定列的值和弹窗显示详细信息...
  4. cve-2020-0796_CVE20200796 | Windows SMBv3客户端/永痕之黑漏洞复现
  5. linux空间支持伪静态,[转载]Linux下nginx支持.htaccess文件实现伪静态的方法
  6. 花书+吴恩达深度学习(二十)构建模型策略(超参数调试、监督预训练、无监督预训练)
  7. Mycat读写分离以及拆库拆表综合实验3:通过日志分析mycat路由过程
  8. IOS APP 上传到AppStore
  9. 理解运放的虚断和虚短
  10. 电子设计大赛-室内可见光定位装置
  11. XiaoXin 13Pro-Hackintosh 小新13pro崇尚极简的黑苹果双系统
  12. 简单易懂的计算机网络相关名词的解释--集线器篇(持续更新)
  13. 如何防止亚马逊账号被关联?
  14. ISP - 没有实现编码/解码功能 - VPU区别
  15. 达内培训 Android糯米,一种用于糯米烧卖(麦)成型的内馅供料组件的制作方法...
  16. 华为机考1-54题总结
  17. 实用技能一:防抖与节流
  18. CSDN超简单的上传gif动图方法
  19. STM32F103ZE TFT液晶代码移植
  20. linux配置网卡绑定后不生效,Linux双网卡绑定实现负载均衡和失效保护

热门文章

  1. 抖音AI火了!以视频搜视频,不知小姐姐叫什么,也能搜出她的影像
  2. 拒绝DNN过拟合,谷歌准确预测训练集与测试集泛化差异,还开源了数据集 | ICLR 2019...
  3. 《C++面向对象高效编程(第2版)》——3.13 采用语义
  4. gcc/g++链接时.o文件及库的顺序问题
  5. Linux jobs等前后台运行命令详解
  6. JS获取iFrame的内容
  7. LTE: UE特定的参考信号
  8. Linux 操作系统原理 — 内存 — Cache 和 Buffer
  9. FOC驱动器和无刷电调的区别
  10. web复习day03:request