题解 ARC171B【Chmax】
考察题面中的操作究竟做了什么,不难发现其实是将所有满足 的 连边,得到若干条链,然后 即为 所在链的最后一个节点。
显然,存在 时无解,存在 但 时也无解。
否则,每个 的位置填的数都唯一确定了(必须是下一个满足 的 ),只需计算将剩下的数填入 中,且满足 的方案数。这个是十分容易的。具体来说就是从小到大枚举 ,统计有多少个不超过 的数还没有用过,然后如果当前位置需要填一个数,就从这些数中选择一个填入,乘法原理统计即可。
typedef Modint<998244353> mint;
int n, a[N], lst[N], vis[N];
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n;
rep(i, 1, n) cin >> a[i];
per(i, n, 1) {
if(a[i] < i) {
cout << 0 << endl;
return 0;
}
if(lst[a[i]]) vis[lst[a[i]]] = 1;
else if(i != a[i]) {
cout << 0 << endl;
return 0;
}
lst[a[i]] = i;
}
mint cnt = 0, ans = 1;
rep(i, 1, n) {
cnt += !vis[i];
if(i == a[i]) {
ans *= cnt;
--cnt;
}
}
cout << ans << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2022-02-05 虚树学习笔记