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

题解:P14364 [CSP-S 2025] 员工招聘

【写于2026-02-21】【搬运于2026-5-2】

太深刻了。看了很多次题解尝试理解都失败了。算是记录一些之前没想通的点吧。

参考:https://www.luogu.com.cn/article/6jgvpe05 ,第一篇 jiangly 的题解和这篇本质上思路一致。

首先明确题意:每天题目难度已定,但面试的人可以任意排序。

对于难题对应天,一定是无法面试通过的。而对应简单题的天,有两种情况:

  • 耐心足够,面试通过
  • 耐心不够,自己跑了

我们只对简单题对应天进行决策面试人要不要通过。对于已重排顺序后的第 \(i\) 个人,若他的忍耐值为 \(v_{i}\)(原序列中的某个 \(c_i\)),设前 \(i-1\) 个人走了 \(t_i\) 个,那么这个人会在 \(v_i\le w_i+t_i\) 时走掉。\(w_i\) 是这个 \(s_i=1\) 在原串中前面 \(0\) 的个数,表示因为难题而强制走掉的人。以下讨论的“人”和面试是否通过,未特殊说明默认为简单题对应天。记简单天数为 \(k\) 天。

\(m=1\) 的情况看上面的题解。

我们尝试去分别计算每个走人情况被多少排列方案取到,即把答案表示成 \(ans = \sum_{i=0}^{k-m} g_i\)\(g_i\) 表示 \(i\) 个人通过面试。这样 \(t_i\) 可以当做定值,会好处理得多。可以认为,这里的 \(i\) 表示的是 dp 状态中的第二维 \(x\)

对于一个 \(i\),如果我们指定他走,那么 \(v_i\) 就要 \(\le w_i+t_i\)。否则需要 \(>w_i+t_i\)。出现了两个方向,不好处理。我们发现,\(v_i\le w_i+t_i\) 因为满足单调性所以计数较为简单(\(w_i\) 单增,\(t_i\) 也单增)。所以考虑将 \(v_i\le w_i+t_i\) 作为容斥的钦定条件,没有钦定的天数不受限制,我们最后需要容斥出除了选中的 \(x\) 天,没有其他天满足 \(v_i\le w_i+t_i\) 于是就有了 dp 的第三维 \(y\),表示钦定的不属于选中的 \(x\) 天但满足 \(v_i\le w_i+t_i\) 的天数。

梳理一下,状态转移有三种:

  1. \(i\) 个人耐心不够走了,对第二维有贡献

或者第 \(i\) 个人没走:

  1. 钦定第 \(i\) 个人耐心不够但没走,是不合法方案,对第三维有贡献,之后是要被容斥掉的。
  2. 不管第 \(i\) 个人耐心够不够,不钦定容斥它。

本题的 dp 是对子问题的容斥。意思是,容斥是为了求出子问题的答案。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 510;
const int p = 998244353;
char s[N];
int c[N],sum[N],w[N],f[N][N][N],fac[N];
void add(int &x,int y){x += y;if(x >= p)x -= p;
}
signed main(){int n,m,k = 0;scanf("%lld%lld",&n,&m);scanf("%s",s + 1);fac[0] = 1;for(int i = 1; i <= n; i++){scanf("%lld",&c[i]);sum[c[i]]++;if(s[i] == '1')k++,w[k] = i - k;//第k0个可通过面试题前面有w[k0]套不可通过面试题 fac[i] = fac[i - 1] * i % p;//阶乘 }for(int i = 1; i <= n; i++)sum[i] += sum[i - 1];//忍耐度小于i的人数f[0][0][0] = 1; 
//	for(int i = 1; i <= k; i++){//考虑可能出现决策的k天,有忍耐度不够/面试过了两种情况 for(int x = 0; x < i; x++){for(int y = 0; x + y < i; y++){add(f[i][x + 1][y],f[i - 1][x][y] * max(sum[w[i] + x] - x - y,0 * 1ll) % p);//第i个人忍耐度不够走了 add(f[i][x][y + 1],f[i - 1][x][y] * max(sum[w[i] + x] - x - y,0 * 1ll) % p);//第i个人面试过了,且容斥这个人 add(f[i][x][y],f[i - 1][x][y]);//第i个人面试过了,且不容斥这个人 }}}int ans = 0;for(int i = 0; i <= k - m; i++){//i个人明确拒绝,不能超过k-m个 for(int j = 0; i + j <= k; j++){//对j进行容斥 int x = (j & 1) ? (p - 1) : 1;add(ans,x * f[k][i][j] % p * fac[n - i - j] % p);}}printf("%lld",ans);return 0;
}
//https://www.luogu.com.cn/article/6jgvpe05
http://www.jsqmd.com/news/737268/

相关文章:

  • 避坑指南:ZYNQ驱动W25Q256时,状态寄存器读写与擦除/编程的那些‘坑’
  • 新手零基础入门天梯赛:用快马生成赛题与代码框架快速上手
  • 如何深度掌控AMD Ryzen处理器:SMUDebugTool终极硬件调试指南
  • Spring Boot 2.7.5项目里,HikariCP多数据源配置的坑我帮你踩完了(附完整代码)
  • 低比特量化与3D重建:VersaQ-3D技术解析
  • OneNote插件终极指南:160+功能免费解锁完整笔记生产力
  • 从Sodaverse实践看去中心化数据网络:架构、实现与开发指南
  • MTKClient深度解析:联发科设备底层操作与逆向工程的终极工具
  • 国内专业企业VI设计公司排名榜2026 靠谱品牌升级设计公司推荐 - 设计调研者
  • 3步掌握:用NBTExplorer轻松管理Minecraft游戏数据
  • Hyper-Bagel框架:多模态AI模型的统一加速方案
  • RuleGen:从数据自动生成业务规则的工程实践与核心原理
  • 别再傻傻分不清了!用大白话+生活例子,5分钟搞懂上位机和下位机
  • 新手也能看懂的CISP-PTE备考:用SQLMap搞定三个典型SQL注入靶场(附完整命令)
  • ESP固件烧录终极指南:5分钟掌握esptool核心技巧
  • 从手机铃声到游戏配乐:聊聊那些你可能没听过的音频格式(MIDI、SMF、MMF、RTTTL)
  • [答疑]无人机集群作战,OPM还是SysML
  • 别再为IEEE论文排版头疼了!手把手教你搞定LaTeX图片与表格(附完整代码)
  • HotPlex:将终端AI工具转化为高性能、安全的生产级服务
  • 3分钟学会MTKClient:解锁联发科设备的终极工具箱
  • 终极指南:Video DownloadHelper CoApp 快速安装与使用全攻略
  • 2026年留学机构咋收费,中青留学收费合理,服务专业 - mypinpai
  • 终极指南:3分钟学会使用ArchivePasswordTestTool找回遗忘的压缩包密码
  • 若依前后端分离版部署后,登录头像不显示?从Nginx配置到文件上传路径的完整排错手册
  • LiteAttention:扩散模型中的高效注意力优化方案
  • 中兴光猫工厂模式解锁指南:5分钟获取完整管理权限的终极教程
  • 我给 Claude Code/龙虾 写了个“公众号阅读外挂“skill,终于能好好消化微信文章了
  • 选购瓷砖胶,雷诺瓷砖胶口碑如何? - mypinpai
  • SAP ABAP新手避坑指南:Tabstrip分页签控件里子屏幕数据为啥会“丢”?
  • 为什么选择AlienFX Tools?释放Alienware设备全部潜力的开源硬件控制方案