码迷,mamicode.com
首页 > 其他好文 > 详细

11.02A

时间:2018-11-03 02:21:42      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:格式   复杂   归并   输入格式   接下来   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 的数,所以都不会动,逆序对数不变。

思路

1.40%数据

暴力换,暴力算
期望时间复杂度 $ \Theta \left( m n^{2} \right) $

2.70%数据

暴力换,归并算
期望时间复杂度 $ \Theta \left( mn \log n \right) $

3.100%数据

显然,选出的数字对逆序对的贡献会变为0
那么维护每个数字对答案的贡献,是否选择过
再预处理一下区间最小值
二分答案找下一个小于等于选择数字的位置即可
期望时间复杂度 $ \Theta \left( n \log n \right) $

11.02A

标签:格式   复杂   归并   输入格式   接下来   strong   处理   二分   初始   

原文地址:https://www.cnblogs.com/ullio/p/9899124.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!