在这个问题中,您必须分析特定的排序算法----超快速排序。
该算法通过交换两个相邻的序列元素来处理 n 个不同整数的序列,直到序列按升序排序。
对于输入序列 9 1 0 5 4,超快速排序生成输出 0 1 4 5 9。
您的任务是确定超快速排序需要执行多少交换操作才能对给定的输入序列进行排序。
输入格式
输入包括一些测试用例。
每个测试用例的第一行输入整数 n,代表该用例中输入序列的长度。
接下来 n 行每行输入一个整数 ai,代表用例中输入序列的具体数据,第 i 行的数据代表序列中第 i 个数。
当输入用例中包含的输入序列长度为 0 时,输入终止,该序列无需处理。
输出格式
对于每个需要处理的输入序列,输出一个整数 op,代表对给定输入序列进行排序所需的最小交换操作数,每个整数占一行。
数据范围
0≤n<500000,
一个测试点中,所有 n 的和不超过 500000。
0≤ai≤999999999
输入样例:
5
9
1
0
5
4
3
1
2
3
0
输出样例:
6
0
有点类似逆序对吧
https://www.luogu.com.cn/problem/P1908
逆序对的题解:!!!!!!!!???????????
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n,a[500010],c[500010];
long long ans;
void msort(int b,int e){
if(b == e)
return;
int mid=(b+e)/2,i=b,j=mid+1,k=b;
msort(b,mid);
msort(mid+1,e);
while(i<=mid && j<=e)
if(a[i] <= a[j])
c[k]=a[i];
else
c[k]=a[j],ans+=mid-i+1;
while(i <= mid)
c[k]=a[i];
while(j <= e)
c[k]=a[j];
for(int l=b;l<=e;l++)
a[l]=c[l];
}
int main(){
scanf(“%d”,&n);
for(int i=1;i<=n;i++)
scanf(“%d”,&a[i]);
msort(1,n);
printf(“%lld”,ans);
return 0;
}
一下才是本题题解
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
#include <cstdio>
#include <cstring>
#include <algorithm>
define ll long long
using namespace std;
const int N=500005;
int n,z,vc[N],va[N];
int mlow(int x) {
return x&-x;
}
struct node{
int v,order;
} a[N];
bool cmp(node a,node b){
return a.v[HTML_REMOVED]0;i-=mlow(i))
ans+=vc[i];
return ans;
}
int main(){
int i;
while(scanf(“%d”,&n) && n) {
memset(vc,0,sizeof(vc));
for(i=1; i<=n; i) {
scanf(“%d”,&a[i].v);
a[i].order=i;
}
sort(a+1,a+1+n,cmp);
for(i=1;i<=n;i)
va[a[i].order]=i;
ll ans=0;
for(i=1;i<=n;i++) {
update(va[i],1,n);
ans += i-sum(va[i]);
}
printf(“%lld\n”,ans);
}
return 0;
}
喜欢的话,关注我
嘿嘿嘿嘿