题目链接
题目类型:树状数组求逆序数
题目来源:2016年多校Round4
题目分析
题目大意
对n个数字冒泡排序,问,对于每一个数字,能到达的最大位置和最小位置的距离是多少
解析
分析一下题目中给出的冒泡排序代码,第一层for执行N次循环,第二层for表示从后往前,轻的泡泡往前冒,也就是说,小的一直往前换,大的被动的跟着小的换。也就是说,对于一个位置的数来讲,右边有多少比他小的数,他就要往右移多少次,左边有多少比他大的数字,他就要往左移动多少次。找到这个规律,发现就是求从左往中间每个点的逆序数,以及从中间每个点往右的顺序数。逆序数不难求,从左往右用树状数组更新即可。顺序数相当于是从右往左的逆序数,反向插入,求之前有多少逆序数即可。找到r[]和l[]之后,发现每个点所能到达的最大位置为pos[i]+r[i],最小位置为min(pos[i]+r[i]-l[i], i),求个差取个绝对值即可。
代码
1 |
|