标签:格式 复杂 归并 输入格式 接下来 strong 处理 二分 初始
有 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 的数,所以都不会动,逆序对数不变。
暴力换,暴力算
期望时间复杂度 $ \Theta \left( m n^{2} \right) $
暴力换,归并算
期望时间复杂度 $ \Theta \left( mn \log n \right) $
显然,选出的数字对逆序对的贡献会变为0
那么维护每个数字对答案的贡献,是否选择过
再预处理一下区间最小值
二分答案找下一个小于等于选择数字的位置即可
期望时间复杂度 $ \Theta \left( n \log n \right) $
标签:格式 复杂 归并 输入格式 接下来 strong 处理 二分 初始
原文地址:https://www.cnblogs.com/ullio/p/9899124.html