<—点个赞吧QwQ
宣传一下算法提高课整理{:target=”_blank”}
在这个问题中,您必须分析特定的排序算法----超快速排序。
该算法通过交换两个相邻的序列元素来处理 $n$ 个不同整数的序列,直到序列按升序排序。
对于输入序列 9 1 0 5 4
,超快速排序生成输出 0 1 4 5 9
。
您的任务是确定超快速排序需要执行多少交换操作才能对给定的输入序列进行排序。
输入格式
输入包括一些测试用例。
每个测试用例的第一行输入整数 $n$,代表该用例中输入序列的长度。
接下来 $n$ 行每行输入一个整数 $a_i$,代表用例中输入序列的具体数据,第 $i$ 行的数据代表序列中第 $i$ 个数。
当输入用例中包含的输入序列长度为 $0$ 时,输入终止,该序列无需处理。
输出格式
对于每个需要处理的输入序列,输出一个整数 $op$,代表对给定输入序列进行排序所需的最小交换操作数,每个整数占一行。
数据范围
$0 \\le n < 500000$,
一个测试点中,所有 $n$ 的和不超过 $500000$。
$0 \\le a_i \\le 999999999$
输入样例:
5
9
1
0
5
4
3
1
2
3
0
输出样例:
6
0
思路
这题就是归并排序求逆序对数量
代码
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 500010;
int n;
int a[N],tmp[N];
LL merge_sort (int l,int r) {
if (l == r) return 0;
int mid = l + r >> 1;
LL ans = merge_sort (l,mid) + merge_sort (mid + 1,r);
int i = l,j = mid + 1,k = 0;
while (i <= mid && j <= r) {
if (a[i] <= a[j]) tmp[k++] = a[i++];
else {
tmp[k++] = a[j++];
ans += mid - i + 1;
}
}
while (i <= mid) tmp[k++] = a[i++];
while (j <= r) tmp[k++] = a[j++];
for (int i = l,j = 0;i <= r;i++,j++) a[i] = tmp[j];
return ans;
}
int main () {
while (cin >> n,n) {
for (int i = 1;i <= n;i++) cin >> a[i];
cout << merge_sort (1,n) << endl;
}
return 0;
}
大佬怎么理解这个ans+=mid-i+1呢?
https://www.acwing.com/solution/content/138121/
这里我的评论看看有没有帮助
因为mid>=mid右边的所有数,所以如果有一个数>mid又在数,则他与mid和mid右边的数都构成逆序对
好的,理解了,学习大佬
哪里,我是菜鸡,才到天边
LL ans = merge_sort (l,mid) + merge_sort (mid + 1,r);
这行什么意思啊大佬
求出两边的逆序对之和
那为啥y总之前讲逆序对的时候没加嘞
有的啊,你给一个链接
#include [HTML_REMOVED]
using namespace std;
const int N=100010;
int a[N],cnt[N];
long long n,res;
int merge_sort(int a[],int l,int r)
{
if(l>=r)
return 0;
int mid=l+r>>1;
merge_sort(a,l,mid);
merge_sort(a,mid+1,r);
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r)
{
if(a[i]<=a[j])
cnt[k]=a[i];
else
{
cnt[k]=a[j];
res+=mid-i+1;
}
}
while(i<=mid)
cnt[k]=a[i];
while(j<=r)
cnt[k]=a[j];
for(int i=0,j=l;j<=r;i,j)
a[j]=cnt[i];
}
int main()
{
cin>>n;
for(int i=0;i[HTML_REMOVED]>a[i];
merge_sort(a,0,n-1);
cout<<res;
return 0;
}
你确定是y总的吗。。。
y总代码质量不会这么差吧,连int返回值的函数都不返回数字
哦哦看错了y总也加了,谢谢佬
good 其实理解了很简单
%%%输入很棒