归并排序
#include<bits/stdc++.h>
using namespace std;
/*void mergesort(int arr[],int L,int R){
if(R-L+1<1)
return;
sortprocess(arr, L, R);
}*/
void Merge(int arr[],int L,int mid,int R){
int help[R-L+1];
int p1=L;
int p2=mid+1;
int i=0;
while(p1<=mid&&p2<=R){ //两个都不越界
help[i++]=arr[p1]<arr[p2]?arr[p1++]:arr[p2++];
}
//两个有必只有一个越界
while(p1<=mid){ //右 越界
help[i++]=arr[p1++];
}
while(p2<=R){ //左 越界
help[i++]=arr[p2++];
}
for(int i=0;i<R-L+1;i++){
arr[L+i]=help[i];
}
}
void sortprocess(int arr[],int L,int R){
if(L==R) return ;
int mid = L + ((R - L) >> 1);
sortprocess(arr,L,mid);
sortprocess(arr,mid+1,R);
Merge(arr,L,mid,R);
}
void mergesort(int arr[],int L,int R){
if(R-L+1<1){
return ;
}
sortprocess(arr, L, R);
}
int main(){
int arr[100];
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>arr[i];
mergesort(arr,0,n);
for(int i=0;i<n;i++)
cout<<arr[i]<<" ";
}
输入:5
1 3 4 2 5
输出:1 2 3 4 5
小和问题
#include<bits/stdc++.h>
using namespace std;
/*void mergesort(int arr[],int L,int R){
if(R-L+1<1)
return;
sortprocess(arr, L, R);
}*/
int Merge(int arr[],int L,int mid,int R){
int help[R-L+1];
int p1=L;
int p2=mid+1;
int i=0;
int sum=0;
while(p1<=mid&&p2<=R){ //两个都不越界
sum+=arr[p1]<arr[p2]?(arr[p1]*(R-p2+1)):0;//分批榨出产生小和数
help[i++]=arr[p1]<arr[p2]?arr[p1++]:arr[p2++];
}
//两个有必只有一个越界
while(p1<=mid){ //右 越界
help[i++]=arr[p1++];
}
while(p2<=R){ //左 越界
help[i++]=arr[p2++];
}
for(int i=0;i<R-L+1;i++){
arr[L+i]=help[i];
}
return sum;
}
/*void sortprocess(int arr[],int L,int R){
if(L==R) return ;
int mid = L + ((R - L) >> 1);
sortprocess(arr,L,mid);
sortprocess(arr,mid+1,R);
Merge(arr,L,mid,R);
}*/
int mergesort(int arr[],int L,int R){
if(R==L){
return 0;
}
int mid = L + ((R - L) >> 1);
return mergesort(arr,L,mid)+
mergesort(arr,mid+1,R)+
Merge(arr,L,mid,R);
// sortprocess(arr, L, R);
}
int smallsum(int arr[],int L,int R){
if(R-L<1){
return 0;
}
return mergesort(arr,L,R);
}
int main(){
int arr[100];
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>arr[i];
cout<<smallsum(arr,0,n-1);
//mergesort(arr,0,n);
// for(int i=0;i<n;i++)
// cout<<arr[i]<<" ";
}
输入:5
1 3 4 2 5
输出:16
在一个数列中,任意元素p左边所有比p小的数之和,即为小和。