求逆序?qū)€數(shù)歸并排序模板
#include<bits/stdc++.h>
using namespace std;
char seq[2000005];
int a[2000005];
int b[2000005];
int len;
long long int ans=0;
void Merge(int first,int middle,int last)
{
? ? int i,j,k;
? ? i=first;
? ? j=middle+1;
? ? k=0;
? ? while(i<=middle&&j<=last)
? ? {
? ? ? ? if(a[i]<=a[j])b[++k]=a[i++];
? ? ? ? else ans+=middle-i+1,b[++k]=a[j++];
? ? }
? ? while(i<=middle)b[++k]=a[i++];
? ? while(j<=last)b[++k]=a[j++];
? ? for(i=1;i<=k;i++)a[first+i-1]=b[i];
}
void MergeSort(int Start,int End)
{
? ? if(Start<End)
? ? {
? ? ? ? int Mid=(Start+End)/2;
? ? ? ? MergeSort(Start,Mid);
? ? ? ? MergeSort(Mid+1,End);
? ? ? ? Merge(Start,Mid,End);
? ? }
}
int main()
{
? ? scanf("%s",seq+1);
? ? len=strlen(seq+1);
? ? for(int i=1;i<=len;i++)a[i]=seq[i]-'A'+1;
? ? MergeSort(1,len);
? ? printf("%lld",ans);
? ? return 0;
}