K11945 交换排序
今天我们讲一题交换排序,先看题目和样例吧。
这一题是分治,分为三步:
① 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题。
② 治理:递归地解各个子问题,若子问题规模较小容易被解决则停止递归,直接求解。
③ 合并:将各个子问题的解合并为原问题的解。
我们来看一下代码:
#include<bits/stdc++.h>
using namespace std;
long long a[5000010],t[5000010];
long long count(long long l,long long r){
long long ans=0;
if(l==r) return 0;
long long m=(l+r)/2;
ans+=count(l,m);
ans+=count(m+1,r);
long long i=l,j=m+1,k=l;
while(i<=m&&j<=r){
if(a[i]<=a[j]) t[k++]=a[i++];
else{
t[k++]=a[j++];
ans+=m-i+1;
}
}
while(i<=m) t[k++]=a[i++];
while(j<=r) t[k++]=a[j++];
for(i=l;i<=r;i++) a[i]=t[i];
return ans;
}
int main(){
long long n,tot=0;
cin>>n;
for(int i=1;i<=n;i++){
long long m;
cin>>m;
for(int i=1;i<=m;i++){
cin>>a[i];
}
cout<<"Scenario #"<<++tot<<":"<<endl;
cout<<count(1,m)<<endl<<endl;
}
return 0;
}