11.02A
Posted ullio
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11.02A相关的知识,希望对你有一定的参考价值。
题目描述
有 n 个整数,a1 一直到 an,按照下标从 1 到 n 排列到一行。接下来 m 个操作,每次选取下
标 x,并将下标大于等于 x 且不比 a[x]大的数字取出来,按照从小到大排序,之后放回所取
下标的位置。你要计算出初始的逆序对数以及每次操作后的逆序对数。
比如有 5 个数字,2 3 4 5 1,我们选下标 1,那么把下标 1 之后且不小于 2 的取出来,变成
成了 _ 3 4 5 _,把 2 1 排序变成 1 2,放回去变成 1 3 4 5 2。
输入输出格式
输入格式
第一行包含三个整数 n,m,表示数个数和操作的次数。
接下来 n 个数字,a1,a2……an,ai 可能相同,分别表示编号 1,2……n。最
后 m 行,每行一个数字,表示要选取的下标。
输出格式
输出 m+1 的整数,分别是一开始的逆序对数,进行了 i 次操作后的逆序对数。
数据范围
0<=ai<=1e6
对于 40%的数据,1 <= n <= 20,1 <= m <= 20。
对于 70%的数据,1 <= n,m <= 10^3。
对于 100%的数据,1 <= n,m <= 10^5
样例
样例一输入:
3 2
2 3 1
1
1
样例一输出:
2
1
1
初始的逆序对数为 2,当选中第一个数的时候,后面小于 2 的数只有 1,排序后变成 1,2,
然后放回那些取的位置,变为 1 3 2,逆序对数变成了 1。再次选中第一个数,后面没有小
于 1 的数,所以都不会动,逆序对数不变。
思路
1.40%数据
暴力换,暴力算
期望时间复杂度 $ Theta left( m n^{2}
ight) $
2.70%数据
暴力换,归并算
期望时间复杂度 $ Theta left( mn log n
ight) $
3.100%数据
显然,选出的数字对逆序对的贡献会变为0
那么维护每个数字对答案的贡献,是否选择过
再预处理一下区间最小值
二分答案找下一个小于等于选择数字的位置即可
期望时间复杂度 $ Theta left( n log n
ight) $
以上是关于11.02A的主要内容,如果未能解决你的问题,请参考以下文章