重刷信奥赛一本通日记-2

今天是重刷一本通的第二天

今天刷的是第二章的数据排序

这次呢

题有点多

直接放上前两个题的代码罢

T1车厢重组

/*T1车厢重组
这个小水题我们直接用冒泡排序过了罢*/
#include<iostream>
using namespace std;
int main(){
int n,a[n+1]={0},ans;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
if(a[i]<a[j]){
int t=a[i];
a[i]=a[j];
a[j]=t;
ans++;
}
}
}
cout<<ans;
return 0;     
}

T2求逆序对

/*T2求逆序对
归并排序直接上*/
#include<cstdio>
int n,a[100001],c[100001];
unsigned long long ans=0;
void m(int l,int r){
int mid=(l+r)/2,i,j,tmp;
if(l>=r)
return;
m(l,mid);
m(mid+1,r);
tmp=l;
for(i=l,j=mid+1;i<=mid&&j<=r;)
if(a[i]>a[j])
c[tmp++]=a[j++],ans+=mid-i+1;
else c[tmp++]=a[i++];
if(i<=mid)
for(;i<=mid;)
c[tmp++]=a[i++];
if(j<=r)
for(;j<=r;)
c[tmp++]=a[j++];
for(i=l;i<=r;i++)
a[i]=c[i];
}
int main(void){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",a+i);
m(1,n);
printf("lld",ans);
return 0;
}

 

posted @ 2020-05-20 23:34  快乐老家远征军  阅读(161)  评论(0编辑  收藏  举报