BZOJ5322:[JXOI2018]排序问题——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5322
https://loj.ac/problem/2543 <-可以看数据,要没有这数据我死活调不出来。
https://www.luogu.org/problemnew/show/P4561
题面见上。
我们知道可重元素全排列=元素个数!/(每个元素个数!加和)。
所以一个很显然的贪心就是我们取元素使得每个元素的个数都尽可能小。
我们先离散化,然后二分出sum,表示l~r我每个元素都取至少sum个(“至少”表示原数列可能有l~r的元素且其个数可能超过了sum个)。
然后各种处理我们就能得到(每个元素个数!加和)了,怎么样,是不是很好想呢?
然而不好写。
注意二分上界为n+m原因就是l~r的元素可能出现在原序列且其个数为n。
#include<cmath>
#include<queue>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=2e5+;
const int M=1e7+N;
const int p=;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
ll qpow(ll k,int n){
ll res=;
while(n){
if(n&)res=res*k%p;
k=k*k%p;n>>=;
}
return res;
}
int jc[M];
int a[N],b[N],num[N];
int n,m,l,r,t,cnt;
inline ll calc(int k){
ll sum=(ll)k*cnt;
for(int i=l;i<=r;i++){
if(num[i]<k)sum+=k-num[i];
}
return sum;
}
void work(){
for(int i=;i<=n;i++)num[a[i]]++;
int L=,R=n+m;
while(L<R){
int mid=(L+R+)>>;
if(calc(mid)<=m)L=mid;
else R=mid-;
}
ll ans=;
int last=m-calc(L);
for(int i=;i<=t;i++){
if(i<l||r<i)ans=ans*jc[num[i]]%p;
else{
if(num[i]>L)ans=ans*jc[num[i]]%p;
else if(last)last--,ans=ans*jc[L+]%p;
else ans=ans*jc[L]%p;
}
}
ans=ans*qpow(jc[L+],last)%p*qpow(jc[L],cnt-last)%p;
printf("%lld\n",qpow(ans,p-)*jc[n+m]%p);
}
void LSH(){
sort(b+,b+n+);
t=unique(b+,b+n+)-b-;
for(int i=;i<=t;i++)num[i]=;
for(int i=;i<=n;i++){
a[i]=lower_bound(b+,b+t+,a[i])-b;
}
cnt=r-l;
l=lower_bound(b+,b+t+,l)-b;
r=upper_bound(b+,b+t+,r)-b-;
cnt-=r-l;
}
int main(){
jc[]=;
for(int i=;i<M;i++)jc[i]=(ll)jc[i-]*i%p;
int T=read();
while(T--){
n=read(),m=read(),l=read(),r=read();
for(int i=;i<=n;i++)a[i]=b[i]=read();
LSH();
work();
}
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ5322:[JXOI2018]排序问题——题解的更多相关文章
- BZOJ5322 [Jxoi2018]排序问题 【贪心】
题目链接 BZOJ5322 题解 意思就是使有序的排列尽量少 就是使相同的数尽量少 然后大力贪心即可 #include<algorithm> #include<iostream> ...
- BZOJ5322 JXOI2018排序问题
对于一个序列,重排后有序的概率显然是∏cnti!/n!,其中cnti为第i种数出现次数.要使概率最小,显然应该让各种数字尽量平均分配.剩下的是div2BC左右的大讨论. #include<ios ...
- BZOJ5322: [JXOI2018]排序问题
传送门 不难看出期望就是 \(\frac{(n+m)!}{\prod_{v=1}^{max}(cnt_v!)}\),\(cnt_v\) 表示 \(v\) 这个数出现的次数. 贪心就是直接把 \(m\) ...
- 【BZOJ5322】[JXOI2018]排序问题(模拟)
[BZOJ5322][JXOI2018]排序问题(模拟) 题面 BZOJ 洛谷 题解 这题就显得很呆. 显然就是每次找到\([l,r]\)中出现次数最小的那个数并且放一个. 然后随便模拟一下就好了Qw ...
- JXOI2018简要题解
JXOI2018简要题解 T1 排序问题 题意 九条可怜是一个热爱思考的女孩子. 九条可怜最近正在研究各种排序的性质,她发现了一种很有趣的排序方法: Gobo sort ! Gobo sort 的算法 ...
- 5322: [Jxoi2018]排序问题
5322: [Jxoi2018]排序问题 链接 分析: 每次选一个出现次数最小的. 代码: #include<cstdio> #include<algorithm> #incl ...
- 并不对劲的bzoj5322:loj2543:p4561:[JXOI2018]排序问题
题目大意 \(T\)(\(T\leq10^5\))组询问 每次给出\(n,m,l,r\),和\(n\)个数\(a_1,a_2,...,a_n\),要找出\(m\)个可重复的在区间\([l,r]\)的数 ...
- 洛谷P4561 [JXOI2018]排序问题(二分 期望)
题意 题目链接 Sol 首先一种方案的期望等于它一次排好的概率的倒数. 一次排好的概率是个数数题,他等于一次排好的方案除以总方案,也就是\(\frac{\prod cnt_{a_i}!}{(n+m)! ...
- [JXOI2018]排序问题
嘟嘟嘟 这是今天做的第二道九条可怜的题,现在对他的题的印象是:表面清真可做,实则毒瘤坑人. 首先要感谢吉司机,我期望学的特烂,好在样例直接告诉我们期望怎么求了. 令\(b_i\)表示第\(i\)个不同 ...
随机推荐
- imageNamed和imageWithContextOfFile的区别?哪个性能高
imageNamed性能高 1.用imageNamed的方式加载时,图片使用完毕后缓存到内存中,内存消耗多,加载速度快.即使生成的对象被 autoReleasePool释放了,这份缓存也不释放,如果图 ...
- appium -- 页面出现弹窗,关闭后,无法识别页面元素
1. 问题:如图所示:在修改手势密码的过程中,点击了返回按钮后,弹出该弹窗:点击继续设置后,就发现 driver.getPageSource()获取不到页面元素.在找了一圈无用的资料后,没有什么好的处 ...
- 监控系统cpu相关统计信息
背景:需要测试监控各个操作系统平台机器上的cpu相关的各种统计信息 为了方便测试,我写了一个比较通用的shell脚本,目前可以兼容Redhat6+,Redhat7+,其他操作系统没测,可以实时监控机器 ...
- lesson 19 A very dear cat
lesson 19 A very dear cat dear adj. 亲爱的:尊敬的:昂贵的 表示几乎不,很少的词语 rarely hardly seldom scarcely flat = apa ...
- 前端开发工程师 - 01.页面制作 - 第1章.Photoshop切图
第1章--Photoshop切图 工具.面板.视图 什么是切图? 1. 从设计稿(.psd)中切出网络素材,如按钮.图标.logo.背景图等 2. 编写代码,在代码中使用图片,生成静态页面 --给网页 ...
- centos端口管理
centos 6.5 ###############配置filter表防火墙############### #清除预设表filter中的所有规则链的规则iptables -F #清除预设表filter ...
- 嵌入式码农的10年Bug调试经验,值得一看
下面这些都是我经历过的会导致难点bug的问题: 1.事件顺序.在处理事件时,提出下列问题会很有成效:事件可以以不同的顺序到达吗?如果我们没有接收到此事件会怎么样?如果此事件接连发生两次会怎么样?哪怕通 ...
- 自动对象&局部静态对象
一.关键点 对象的生命周期:程序执行过程中,该对象存在的那段时间 局部对象:形参.函数体内部定义的变量 二.自动对象 自动对象:只存在于块执行期间的对象 包括:局部变量.形参 三.局部静态对象 特点: ...
- java利用POI实现读取Word并获取指定样式的文本
import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.model.StyleDescription; import o ...
- oracle数据库之触发器
触发器是许多关系数据库系统都提供的一项技术.在 ORACLE 系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的 PL/SQL 块. 一. 触发器类型 触发器在数据库里以独立的对象存储,它与 ...