「atcoder - agc054c」Roughly Sorted
高妙题,我只会到构造下界那一步……
构造下界比较容易,只需要注意到交换一次最多让序列向合法迫近一步即可。则答案下界为 。
然后需要构造一个映射:排列长相到每个位置的逆序对数量的单射(因为逆序对数量可能不合法……),意即每个位置的逆序对数量唯一决定了排列。证明考虑交换排列任意两项即证。
然后就容易了, 不合法, 的我们不会去调整(必定劣),只有 时给了我们 的操作空间,乘起来即可。
int n, K, a[5100], cnt[5100];
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> K;
for (int i = 1; i <= n; ++i) cin >> a[i];
for (int i = 1; i <= n; ++i) {
for (int j = 1; j < i; ++j) cnt[i] += a[j] > a[i];
}
int ans = 1;
for (int i = 1; i <= n; ++i)
if (cnt[i] == K) ans = 1ll * ans * (n - i + 1) % 998244353;
cout << ans << "\n";
}
本文作者:𝒸𝒾𝓇𝓃ℴ𝓋𝓈𝓀𝓎
本文链接:https://www.cnblogs.com/orchid-any/p/16603259.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2021-08-19 「tricks」平凡二分幻术