• 洛谷 P1908 逆序对


    题目

    P1908 逆序对

    思路

    方法一:归并排序求逆序对
    方法二:树状数组求逆序对

    (Code)

    方法一:

    #include<bits/stdc++.h>
    using namespace std;
    int n,a[500001],temp[500001];
    long long ans;
    inline int read(){
    	int x=0;bool f=0;char c=getchar();
    	while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();}
    	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    	return f?-x:x;
    }
    inline void merge_sort(int l,int r,int mid){
    	int i=l,j=mid+1,tot=0;
    	while(i<=mid&&j<=r){
    		if(a[i]>a[j]){
    			ans+=mid-i+1;//当a[i]这个点大于a[j]时a[i~mid]都大于a[j](因为是排好序的)。
    			temp[++tot]=a[j++];
    		}else temp[++tot]=a[i++];
    	}
    	while(i<=mid){
    		temp[++tot]=a[i++];
    	}
    	while(j<=r){
    		temp[++tot]=a[j++];
    	}
    	for(int k=1;k<=tot;++k){
    		a[l++]=temp[k];
    	}
    }
    void merge(int l,int r){
    	if(l==r) return;
    	int mid=(l+r)>>1;
    	merge(l,mid);merge(mid+1,r);
    	merge_sort(l,r,mid);
    }
    
    int main(){
    	n=read();
    	for(int i=1;i<=n;++i){
    		a[i]=read();
    	}
    	merge(1,n);
    	printf("%lld",ans);
    	return 0;
    }
    

    方法二:

    #include<bits/stdc++.h>
    #define MAXN 500001
    #define lowbit(x) x & (-x)
    using namespace std;
    int n;
    int a[MAXN],c[MAXN],hash[MAXN];
    inline int read(){
    	int x=0;bool f=0;char c=getchar();
    	while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();}
    	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    	return f?-x:x;
    }
    void add(int x){
    	while(x<=n){
    		c[x]++;
    		x+=lowbit(x);
    	}
    }
    int sum(int x){
    	int ans=0;
    	while(x){
    		ans+=c[x];
    		x-=lowbit(x);
    	}
    	return ans;
    }
    
    int main(){
    	long long ans=0;
    	n=read();
    	for(int i=1;i<=n;++i){
    		a[i]=read(),hash[i]=a[i];
    	}
    	sort(hash+1,hash+n+1);
    	for(int i=1;i<=n;++i){
    		int x=lower_bound(hash+1,hash+n+1,a[i])-hash;
    		add(x);
    		ans+=i-sum(x);
    	}
    	cout<<ans<<'
    ';
    	return 0;
    }
    
  • 相关阅读:
    电子邮件为什么要编码以及产生乱码的原因?
    UTF8国际通用为什么还要用GBK?
    python 调用shell命令的方法
    script —— 终端里的记录器
    IP数据报是如何在网络中转发的?
    网际协议:无连接数据报交付(IPv4)
    fork与vfork
    strlen与sizeof有什么区别?
    网络地址到物理地址的映射(ARP)
    分类的因特网地址
  • 原文地址:https://www.cnblogs.com/poi-bolg-poi/p/11116537.html
Copyright © 2020-2023  润新知