【JXOI2018】排序问题 贪心
我们令sumi表示数字i在加完数字的数列中出现的次数,那么答案显然为(n+m)!∑∞i=0sumi!
不难发现,当每次添加的数为[l,r]中出现次数最少的数时,答案就是最小的了。
然后就没了
貌似我常数比较大在loj上是997ms过的。。。。。。
1 #include<bits/stdc++.h> 2 #define M 20000005 3 #define L long long 4 #define MOD 998244353 5 using namespace std; 6 const L INF=2e9; 7 8 map<int,int> mp; 9 L num[M]={0},nn=0; 10 L n,m,l,r; 11 12 L pow_mod(L x,L k){L ans=1; for(;k;k>>=1,x=x*x%MOD) if(k&1) ans=ans*x%MOD; return ans;} 13 L fac[M]={0}; 14 15 L Main(){ 16 nn=0; 17 mp.clear(); 18 scanf("%d%d%d%d",&n,&m,&l,&r); 19 L F=fac[n+m]; 20 for(L i=1;i<=n;i++){ 21 L x; scanf("%d",&x); 22 mp[x]++; 23 } 24 L mul=1; 25 for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++){ 26 L x=it->first,y=it->second; 27 if(!(l<=x&&x<=r)) mul=mul*fac[y]%MOD; 28 else num[++nn]=y; 29 } 30 num[nn+1]=0; 31 sort(num+1,num+nn+1); 32 if(nn) reverse(num+1,num+nn+1); 33 L lr=r-l+1; num[0]=INF; 34 for(L i=nn;~i;i--){ 35 L mns=1LL*(lr-i)*(num[i]-num[i+1]); 36 if(mns<=m) {m-=mns; continue;} 37 L up=num[i+1]+m/(lr-i); 38 L yu=m%(lr-i); 39 L mul2=pow_mod(fac[up+1],yu); 40 L mul1=pow_mod(fac[up],lr-i-yu); 41 mul=mul*mul1%MOD*mul2%MOD; 42 for(int j=i;j>=1;j--){ 43 mul=mul*fac[num[j]]%MOD; 44 } 45 break; 46 } 47 mul=pow_mod(mul,MOD-2); 48 cout<<F*mul%MOD<<endl; 49 } 50 51 int main(){ 52 fac[0]=1; for(L i=1;i<M;i++) fac[i]=fac[i-1]*i%MOD; 53 L cas; cin>>cas; 54 while(cas--) Main(); 55 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!