3 条题解
-
1
#include<bits/stdc++.h> using namespace std; const int N=5e6+2840; long long n,ans,a[N],b[N]; void m(int l,int r){ if(l==r)return; int mid=l+r>>1; m(l,mid); m(mid+1,r); int i=l,j=mid+1,k=l; while(i<=mid&&j<=r){ if(a[i]<=a[j]){ b[k++]=a[i++]; }else{ b[k++]=a[j++]; ans+=mid-i+1; } } while(i<=mid){ b[k++]=a[i++]; } while(j<=r) b[k++]=a[j++]; for(int i=l;i<=r;i++) a[i]=b[i]; } int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } m(1,n); cout<<ans; return 0; } //带飞
-
0
归并排序
#include<bits/stdc++.h> using namespace std; const int N=5e5+5,INF=0x3f3f3f3f; typedef long long LL; LL n,a[N],b[N],ans; void mergesort(int l,int r){ if(l==r)return; int mid=l+r>>1; mergesort(l,mid); mergesort(mid+1,r); int i=l,j=mid+1,k=l; while(i<=mid&&j<=r){ if(a[i]<=a[j])b[k++] = a[i++]; else b[k++] = a[j++],ans+=mid-i+1; } while(i<=mid)b[k++] = a[i++]; while(j<=r)b[k++] = a[j++]; for(int i=l;i<=r;i++)a[i] = b[i]; } int main() { cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; mergesort(1,n); cout<<ans; return 0; }
-
-1
#include <iostream> #include <vector> #define int long long using namespace std; int ans=0; void mergesort(vector<int>&a,int l,int mid,int r){ int *tmp=new int[r-l+1]; int i=l,j=mid+1,index=0; while(i<=mid&&j<=r){ if(a[i]<=a[j])tmp[index++]=a[i++]; else{ tmp[index++]=a[j++]; ans+=mid-i+1; } } while(i<=mid)tmp[index++]=a[i++]; while(j<=r)tmp[index++]=a[j++]; for(int i=0;i<index;i++){ a[l+i]=tmp[i]; } delete[]tmp; } void merge_up2down(vector<int>&a,int l,int r){ if(l>=r)return; int mid=(l+r)>>1; merge_up2down(a,l,mid); merge_up2down(a,mid+1,r); mergesort(a,l,mid,r); } signed main(){ int n; cin>>n; vector<int> a(n); for(int i=0;i<n;i++)cin>>a[i]; merge_up2down(a,0,n-1); cout<<ans<<endl; return 0; }
- 1
信息
- ID
- 1252
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 71
- 已通过
- 23
- 上传者