为了能到远方,脚下的每一步都不能少.|

Creeper_l

园龄:1年3个月粉丝:9关注:13

[AGC054C] Roughly Sorted 题解

题意

定义一种操作为交换 \(a_{i}\)\(a_{i-1}\)。对于一个长度为 \(n\) 的排列,你需要操作若干次,使这个序列变合法,一个序列合法指:满足对于每一个 \(1\le i \le n\),都满足包含 \(a_i\) 的逆序对的个数不超过 \(k\),并且要求最小化操作次数。现在给定一个操作后的序列,询问原序列可能的个数。答案对 \(998244353\) 取模。

思路

我们先来思考如何求从一个序列变为合法序列的最小操作次数。因为操作只能交换相邻两个数,所以一次操作最多只能使逆序对的个数减一。设 \(b_{i}\) 表示包含第 \(i\) 个数的逆序对个数。那么我们每一次都尽量贪心地操作,即操作的 \(i\) 都满足:\(b_{i}>k\) 并且 \(a_{i}<a_{i-1}\)。因为这样操作才能有效果,并且效果最大。

那我们就可以猜想是不是每一次都可以这样操作?那就需要考虑是不是每一次都能找到一个位置满足上述条件。答案是肯定的。考虑用反证法来证明,如果没有位置满足上述条件,即对于每一个 \(b_{i}>k\),都有 \(a_{i-1}< a_{i}\)。那么又因为 \(a_{i-1}< a_{i}\),所以 \(b_{i}\ge b_{i-1}>k\),所以又可以推出 \(a_{i-2} < a_{i-1}< a_{i}\),以此类推,最终可以得到:

\(\begin{cases}a_{1} <a_2<\dots <a_i \\b_i \ge b_i-1 \ge \dots \ge b_1 \end{cases}\)

所以 \(k=0\),但是题目上说 \(k \ge 1\),所以矛盾,于是得证。所以证明到了每一次一定能按照最优的方案去操作,总结操作方式为:每次选择一个 \(i\) 满足 \(b_{i}>k\) 并且 \(a_{i}<a_{i-1}\),交换 \(a_i\)\(a_{i-1}\)

回到原题,再来考虑如何用最终的序列算出原序列可能的个数。首先,我们只考虑 \(b_{i}=k\) 的位置,因为如果 \(b_{i} \ne k\),那么这个数现在的位置和原来的位置是没有变化的。考虑 \(b_i=k\) 的位置,我们会发现原序列中 \(a_{i}\) 这个数的位置一定在 \(i\) 后面,并且在 \(i\) 后面的任意一个位置都可以选择。因为如果在 \(i\) 的前面的话,显然它不会向后移动。所以最终的答案是 \(\prod_{b_{i}=k}^{} (n-i+1)\),总时间复杂度 \(O(n^{2})\),用树状数组可以优化到 \(O(n \log n)\)

Code

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
const int MAXN = 5e3 + 10;
const int mod = 998244353;
int n,k,a[MAXN],b[MAXN],id[MAXN],p,ans;
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin >> n >> k;
	for(int i = 1;i <= n;i++) cin >> a[i];
	for(int i = 1;i <= n;i++)
	{
		int sum = 0;
		for(int j = 1;j < i;j++) if(a[j] > a[i]) sum++;
		if(sum == k) id[++p] = i; 
	} 
	ans = 1;
	for(int i = 1;i <= p;i++) ans = (ans * (n - id[i] + 1)) % mod;
	cout << ans; 
	return 0;
}

本文作者:Creeper_l

本文链接:https://www.cnblogs.com/Creeperl/p/17913455.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Creeper_l  阅读(6)  评论(0编辑  收藏  举报
  1. 1 イエスタデイ(翻自 Official髭男dism) 茶泡饭,春茶,kobasolo
  2. 2 世间美好与你环环相扣 柏松
  3. 3 True love tired
  4. 4 一笑江湖 (DJ弹鼓版) 闻人听書_
  5. 5 最好的安排 曲婉婷
  6. 6 星星在唱歌 司南
  7. 7 山川 李荣浩
  8. 8 On My Way Alan Walker
  9. 9 百战成诗 王者荣耀·100英雄官方群像献礼歌
  10. 10 雪 Distance Capper / 罗言
  11. 11 Edamame bbno$ / Rich Brian
  12. 12 半生雪 七叔-叶泽浩
  13. 13 Catch My Breath Kelly Clarkson
  14. 14 Love Is Gone SLANDER / Dylan Matthew
  15. 15 Endless Summer Alan Walker / Zak Abel
  16. 16 悬溺 葛东琪
  17. 17 风吹丹顶鹤 葛东琪
  18. 18 Normal No More TYSM
  19. 19 哪里都是你 队长
  20. 20 Stronger Kelly Clarkson
  21. 21 廖俊涛
  22. 22 消愁 毛不易
  23. 23 The Runner Yubik
  24. 24 踏山河 七叔-叶泽浩
  25. 25 Waiting For Love Avicii
  26. 26 在你的身边 盛哲
  27. 27 Dream It Possible Delacey
  28. 28 凄美地 郭顶
  29. 29 满天星辰不及你 ycc
  30. 30 侧脸 于果
  31. 31 阿拉斯加海湾 蓝心羽
  32. 32 虞兮叹 闻人听書_
  33. 33 离别开出花 就是南方凯
  34. 34 盗墓笔记·十年人间 李常超 (Lao乾妈)
Normal No More - TYSM
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示