3 条题解

  • 1
    @ 2025-5-10 10:45:29
    #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
      @ 2025-5-10 10:43:59

      归并排序

      #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
        @ 2023-8-24 16:20:00
        #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
        上传者