当前位置: 首页 > news >正文

2025多校CSP模拟赛6

T1:最长不下降子序列 (sequence)

思路:

依据做传统最长不下降子序列的的经验,这题用 \(dp\)

因为 \(a\) 的值只有 \(1,2\) ,并且翻转操作只进行一次,所以我们考虑什么样的情况一次翻转能产生最长不下降子序列呢?

当序列形如 \(\{1,...,1,2,...,2,1,...,1,2,...,2\}\) 时一次翻转会产生最长不下降子序列。

因此,我们设 \(dp_{i,j}\) 表示前 \(i\) 个数,到了第 \(j\) 组的最长不上升子序列的长度。

转移方程为

\[dp_{i,j}=max\{dp_{i,j},dp_{i-1,k}+(a_i=t[j])\} \]

代码:

$code$
#include<iostream>
using namespace std;
const int N=1e6+5;
int n,a[N],dp[N][5],ans;
int t[5]={0,1,2,1,2};
int main(){
//	freopen("sequence.in","r",stdin);
//	freopen("sequence.out","w",stdout);ios::sync_with_stdio(false);cin>>n;for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++){for(int j=1;j<=4;j++){for(int k=1;k<=j;k++){dp[i][j]=max(dp[i][j],dp[i-1][k]+(a[i]==t[j]));}ans=max(dp[i][j],ans);}}cout<<ans<<'\n';return 0;
}
/*
10
2 2 2 1 2 2 1 1 1 1*/

T2:美食节 (food)

思路:

首先考虑在什么情况下无解。显然,当众数的个数大于 \(\lceil \frac{n}{2} \rceil\) 无解。

同时,我们需要在有解的情况下使答案的字典序尽可能的小。

那么我们不妨这样考虑:

从前向后的往答案里填数,若此时的众数正好等于剩余数的一半,那么我们必须填此众数,否则就无解了;否则,我们就把剩下的数中字典序最小的填进去,当然不可以和前一个数种类一样哦。

最后我们只需要找一个东西来维护就好啦,线段树和 \(set\) 都可以。我写的 \(set\)\(STL\) 万岁 ୧(﹒ᴗ﹒)୨ )

代码:

$code$
#include<iostream>
#include<vector>
#include<set>
using namespace std;
const int N=300000+5;
int n,m,a[N],cnt[N],last,c[N];
vector<int> v[N];set<pair<int,int>> s,t;
int main(){
//	freopen("food.in","r",stdin);
//	freopen("food.out","w",stdout);ios::sync_with_stdio(false);cin>>n;m=n;for(int i=1;i<=n;i++){cin>>a[i];v[a[i]].push_back(i),cnt[a[i]]++;}for(int i=1;i<=n;i++) if(cnt[i]) s.insert(make_pair(cnt[i],i)),t.insert(make_pair(v[i][0],i));int x=(*s.rbegin()).first;if(x>(n+1)>>1){cout<<-1<<'\n';return 0;}for(int i=1;i<=n;i++,m--){pair<int,int> q=*s.rbegin();if(q.first*2-1==m){last=q.second;s.erase(make_pair(cnt[q.second],q.second));s.insert(make_pair(--cnt[q.second],q.second));t.erase(make_pair(v[q.second][c[q.second]],q.second));if(cnt[q.second]) t.insert(make_pair(v[q.second][++c[q.second]],q.second));cout<<v[q.second][c[q.second]+!cnt[q.second]-1]<<' ';}else{pair<int,int> p=*t.begin();if(p.second==last) p=*(++t.begin());last=p.second;s.erase(make_pair(cnt[p.second],p.second));s.insert(make_pair(--cnt[p.second],p.second));t.erase(make_pair(v[p.second][c[p.second]],p.second));if(cnt[p.second]) t.insert(make_pair(v[p.second][++c[p.second]],p.second));cout<<p.first<<' ';}}return 0;
} 

T3不会(╥╯^╰╥)

T4:概率 (pr)

思路:

显然,前一半的和大于后一半的和=前一半的和小于后一半的和=(1-前后相等)/2

总方案数是好求的,\((m+1)^{2n}\)

我们只需要容斥一下前后相等的方案数就行。

我们不妨令后一半的数都为负数,这样前后的和就为 \(0\) 了。然后再给后一半的每一个数加上 \(m\) ,则这 \(2n\) 个数的和为 \(nm\)

这时问题就转化为了基于容斥原理解决不定方程非负整数解计数问题

我们先忽略每个数属于 \([0,m]\) 的限制范围。那么此时的方案数可以用插板法来求。

我们现钦定 \(f_i\) 表示有 \(i\) 个位置的数大于 \(m\)

\[f_i=C_{2n}^i C_{mn-i*(m+1)+2n-1}^{2n-1} \]

如何来理解呢?

首先我们需要从 \(2n\) 个位置里选出 \(i\) 个值超出范围的位置。然后给这些位置每一个先放上 \(m+1\) ,然后剩下的数用插板法分下去即可。

接着,我们设 \(g_i\) 表示恰有 \(i\) 个位置超出范围,由二项式反演得

\[g_i=\sum_{i=0}^{2n}(-1)^if_i=\sum_{i=0}^{2n}(-1)^iC_{2n}^i C_{mn-i*(m+1)+2n-1}^{2n-1} \]

最后照着式子敲代码即可,记得取模哦~~

代码:

$code$
#include<iostream>
#define int long long
using namespace std;
const int N=4e6+10;
int T,n,m,mod,fac[N],inv[N],ans,flag;
inline int qpow(int x,int y){int res=1;while(y){if(y&1) res=(res*x)%mod;x=(x*x)%mod;y>>=1;}return res;
}
inline int C(int n,int m){if(n<m) return 0;return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
signed main(){
//	freopen("pr.in","r",stdin);
//	freopen("pr.out","w",stdout);ios::sync_with_stdio(false);cin>>mod>>T;fac[0]=1;for(int i=1;i<N;i++) fac[i]=fac[i-1]*i%mod;inv[N-1]=qpow(fac[N-1],mod-2);for(int i=N-2;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mod;while(T--){ans=0;flag=1;cin>>n>>m;for(int i=0;i<=2*n;i++){ans=(ans+flag*C(2*n,i)%mod*C(n*m-(m+1)*i+2*n-1,2*n-1)%mod+mod)%mod;flag=-flag;}ans=(qpow(m+1,2*n)-ans+mod)%mod;cout<<ans*qpow(2,mod-2)%mod*qpow(qpow(m+1,2*n),mod-2)%mod<<'\n';}return 0;
}

后言:

闲话
我等皆是修罗恶鬼,自有一套行事准则  ——《第一召唤师》 沈烟 
http://www.hskmm.com/?act=detail&tid=33843

相关文章:

  • Java基础——类型转换,变量、常亮、作用域,基本运算符
  • 洛谷 LGR-246 S 模拟赛
  • godot3D节点本身的偏转数值错误竟会导致空间移动穿模??!
  • 题解:qoj7938 Graph Race
  • java中的初等函数
  • 分治算法
  • 专用硬件神经网络优化技术解析
  • 学习逆向的背景知识(自用)
  • Linux-网络安全私房菜(二)
  • pycharm使用远程的ssh的解释器
  • Android SSL Pinning检测利器:SSLPinDetect技术解析
  • AI元人文:社区调解的数字剧场
  • 2025年粉末冶金制品/零件厂家推荐排行榜,专业制造与高品质服务的首选!
  • Dubbo入门-Dubbo的快速使用
  • 站位2
  • 傅里叶变换及DCT点滴
  • 【未完待续】MkDocs 部署安装教程
  • 傅里叶变换点滴
  • [PaperReading] SAIL-Embedding Technical Report: Omni-modal Embedding Foundation Model
  • 人生四大支柱 - 健康,金钱,工作,关系
  • 英伟达个人AI超算Spark技术解析
  • [buuctf]jarvisoj_level3_x64
  • SpringBoot系列十三:SpringBoot面试常见问题
  • [LangChain] 04. 提示词模板
  • 2025 最新不锈钢板厂家推荐榜:剖析国内头部品牌竞争优势,附优质供应商选择指南N06625/N06600/C70600不锈钢板厂家推荐
  • 2025 夹丝玻璃源头厂家最新推荐排行榜:解析防火 / 艺术 / 酒店等多场景厂商优势,助力精准选型
  • 2025 中空板源头厂家最新推荐排行榜揭晓:覆盖全产业链,老牌与新锐共筑品质标杆
  • 2025 年感温电缆厂家最新推荐榜单:覆盖线型 / 缆式 / 可恢复 / 消防等多类型产品,全方位解析头部企业核心优势
  • 2025 年盖板源头厂家最新推荐榜单:电力 / 隧道 / 电缆沟等多场景适用品牌优选,解析原材料采购与成本控制要点
  • win