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

P14568 【MX-S12-T3】排列题解

P14568 【MX-S12-T3】排列

前言

本题解思路来自梦熊直播视频讲解,本文将进行完整的讲解且给出代码。

思路

对于由 \(op_i=\{0,1\}\)\(op_i=\{2,3\}\) 构成的两个序列,他们内部之间的相对关系是确定的,可以将两个序列根据相对大小来从小到大提取出来分别为序列 \(a\) 和序列 \(b\)

接下来将序列的每个数赋值,对于数字 \(1\)能且仅能赋给 \(a_1\)\(b_1\),接下来数字 \(2\),可以赋给 \(a_2\)\(b_1\) 及另一种情况 \(a_1\)\(b_2\),以此类推。可以设 dp 状态为 \(f_{i,j}\) 表示 \(a\) 序列中已赋值了前 \(i\) 个数,\(b\) 序列中已赋值了前 \(j\) 个数的方案数

大部分的转移方程为

\[f_{i+1,j}=f_{i+1,j}+f_{i,j} \\ f_{i,j+1}=f_{i,j+1}+f_{i,j} \]

但有不合法情况时不能转移,因为我们是从小到大填数,当填的下一个数为前缀最小值时,如果在这个位置左边已填过后缀最大值时,这个位置就没法填。同理当我们填下一个后缀最小值时,看右边是否填过一个前缀最大值

当然判断是否合法可以预处理\(prea_i\) 为填了前 \(i\)\(a_j\)\(op_j=1\)最右的位置,\(preb_i\) 为填了前 \(i\)\(b_j\)\(op_j=3\)最左的位置。

部分应判断是否合法的转移方程为

\[f_{i+1,j}=f_{i+1,j}+f_{i,j},preb_j>a_{i+1},op_{a_{i+1}}=0 \\ f_{i,j+1}=f_{i,j+1}+f_{i,j},prea_i<b_{j+1},op_{b_{j+1}}=2 \]

代码

#include<bits/stdc++.h>
#define ll long long
#define int ll
using namespace std;
const int N=1e6+10;
const int mod=998244353;
const int INF=1e18+7;int n;
deque<int> q;
deque<int> p;int a[N];
int b[N];
int c[N];int f[5005][5005];int preb[N];
int prea[N];void solve(){cin>>n;for(int i=1;i<=n;i++){cin>>c[i];if(c[i]==0){q.push_front(i);//小的放前 }else if(c[i]==1){q.push_back(i);//大的放右 }}for(int i=n;i>=1;i--){//倒着枚举 if(c[i]==2){p.push_front(i);//小的放左 }else if(c[i]==3){p.push_back(i);//大的放右 }}//判断是否存在不可能赋值的情况 int op=0;for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){if(c[i]==3&&c[j]==1){op=1;}if(c[i]==2&&c[j]==0){op=1;}}}if(op){cout<<0;return;}//构建a,b序列(储存位置下标) int lena=0,lenb=0;while(!q.empty()){a[++lena]=q.front();q.pop_front();}while(!p.empty()){b[++lenb]=p.front();p.pop_front();}//预处理 prea[0]=0;for(int i=1;i<=lena;i++){prea[i]=prea[i-1];if(c[a[i]]==1){//前缀最大值 prea[i]=max(prea[i-1],a[i]);//最靠右的位置 }}preb[0]=INF;for(int i=1;i<=lenb;i++){preb[i]=preb[i-1];if(c[b[i]]==3){//后缀最大值 preb[i]=min(preb[i-1],b[i]);//最靠左的位置 }}f[0][0]=1;for(int i=0;i<=lena;i++){for(int j=0;j<=lenb;j++){if(c[a[i+1]]==1||preb[j]>a[i+1]){//最小前缀前有最大的后缀 f[i+1][j]+=f[i][j];f[i+1][j]%=mod;}if(c[b[j+1]]==3||prea[i]<b[j+1]){//最小后缀后有最大的前缀f[i][j+1]+=f[i][j];f[i][j+1]%=mod;}}} cout<<f[lena][lenb];
}signed main(){ios::sync_with_stdio(0);cin.tie(nullptr);   solve();return 0;
}
http://www.jsqmd.com/news/49269/

相关文章:

  • 灵芝孢子粉哪家品牌效果最佳?行业口碑之选推荐
  • 2025年11月氢气检测仪厂家权威推荐榜单:防爆型/便携式/高精度氢气检测仪,专业安全检测设备供应商精选指南
  • 探寻知名的灵芝孢子粉品牌:传承与品质之选
  • 2025年钢刨花压块机制造厂权威推荐榜单:轻薄料压块机/废钢压块机/钢筋压块机源头制造厂精选
  • kafka点对点模式与广播模式的区别
  • 2025 年 11 月靶材厂家权威推荐榜:溅射/磁控溅射/镀膜/旋转靶材,ITO/半导体/光学镀膜/陶瓷/金属/钛/铝/铜/钨/钼/钽/硅/合金/稀土靶材专业解析
  • 降ai率免费网站推荐:实用工具助你高效创作
  • python-input
  • 降ai率工具推荐:助力优化文本AI检测的实用工具盘点
  • ai论文工具推荐:助力学术创作的智能辅助工具盘点
  • Python 中常用的 GUI 库
  • 2025 年 11 月工业气体厂家权威推荐榜:高纯气体/特种气体/医用气体/稀有气体/混合气体,专业供应与安全标准深度解析
  • 2025年焕颜洁面乳工厂权威推荐:纯中药护肤/中药护肤品/绿色安全护肤源头厂家精选
  • 供应链质量协同新玩法:让供应商和你“零距离”协作
  • 2025年烘干机直销厂家权威推荐榜单:污泥烘干机/滚筒烘干机/沙子烘干机源头厂家精选
  • 2025年抽沙船实力厂家权威推荐榜单:采沙船/挖沙船/挖沙船源头厂家精选
  • 写给0-1岁的初创公司合伙人(129):副业营销(Side-Project Marketing)——做工具引流,而不是投广告
  • 2025 防脱生发品牌 TOP5 深度解析:加盟价值、口碑与行业趋势
  • 别拼价格了!这才是注塑厂真正的赚钱之道
  • 2025年评价好的产品认证代办价格,ROHS认证/3A信用等级认证/FSC森林认证/ISO20000/SA8000产品认证办理哪家好
  • 国标GB28181算法算力平台EasyGBS助力实现生产全流程可视化监控与精细化管理
  • 手把手玩转Air8000 BLE外围模式:通知与接收数据详解!
  • 2025年南京留学机构排名前十名:南京留学,英国留学,香港留学,新加坡留学,澳洲留学,美国留学
  • 数据中心水资源使用监管法案遭加州州长否决
  • python的一些文件py/pyc/pyo/pyd/pyi/ipynb
  • 2025年南京留学机构排名:南京留学,英国留学,香港留学,新加坡留学,澳洲留学,美国留学
  • Visual Studio 2026 产品密钥
  • 2025年南京出国留学机构排名:南京留学,英国留学,香港留学,新加坡留学,澳洲留学,美国留学
  • 深入解析:JavaScript介绍 | 程序人生
  • 2025年南京比较好的留学机构:南京留学,英国留学,香港留学,新加坡留学,澳洲留学,美国留学