POJ2299

POJ2299 只要理清逆序数的思想,再套上归并算法的模板再注意点 long long sum。不能用int就ok了。

Source Code

Problem: 2299 User: 64162451
Memory: 3820K Time: 1266MS
Language: C++ Result: Accepted
  • Source Code
  • #include<iostream>
    #include<fstream>
    using namespace std;
    const int N=500005;
    int a[N];
    int t[N];
    long long sum;
    void copy(int *dest,int *src,int b,int e)
    {
    	while(b<=e)
    	{
    		dest[b]=src[b];
    		b++;
    	}
    }
    void merge(int * a,int b,int m, int e)
    {
    	int i=b;
    	int j=m+1;
    	int k=b;
    	while((i<=m)&&(j<=e))
    	{
    		if(a[i]<=a[j])
    			t[k++]=a[i++];
    
    		else
    		{
    			t[k++]=a[j++];
    			sum+=(m-i+1);
    		}
    	}
    	while(i<=m)
    	{
    		t[k++]=a[i++];
    	}
    	while(j<=e)
    	{
    		t[k++]=a[j++];
    	}
    	copy(a,t,b,e);
    }
    void mergesort(int * a,int i,int j)
    {
    		if(i>=j)return;
    		int m=(i+j)/2;
    		mergesort(a,i,m);
    		mergesort(a,m+1,j);
    		merge(a,i,m,j);
    	
    }
    int main()
    {
    	//fstream cin("C:\\Users\\wuyanyisb\\Desktop\\1.txt");
    	int n;
    	while(cin>>n&&n!=0)
    	{
    		sum=0;
    		for(int i=0;i<n;i++)
    			cin>>a[i];
    		mergesort(a,0,n-1);
    		cout<<sum<<endl;
    	}
    	system("pause");
    	return 0;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值