题解 ARC171B【Chmax】

考察题面中的操作究竟做了什么,不难发现其实是将所有满足 Pi>iiPi 连边,得到若干条链,然后 Bi 即为 i 所在链的最后一个节点。

显然,存在 Ai<i 时无解,存在 AiiAj=i 时也无解。

否则,每个 Aii 的位置填的数都唯一确定了(必须是下一个满足 Aj=Aij),只需计算将剩下的数填入 P 中,且满足 Pi<i 的方案数。这个是十分容易的。具体来说就是从小到大枚举 i,统计有多少个不超过 i 的数还没有用过,然后如果当前位置需要填一个数,就从这些数中选择一个填入,乘法原理统计即可。

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;
}
posted @   rui_er  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2022-02-05 虚树学习笔记
点击右上角即可分享
微信分享提示