#1524 : 逆序对

思路:根据归并排序求逆序对,我们知道归并排序是将两个有序数列合并成一个有序数列,那么其中一个数列的x大于另外一个数列的y,那么是不是x所在数列中x及后面的都大于y。s要开long long ,最多可能有(1+100000)*100000/2个;

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int a[100005];
 5 int b[100005];
 6 long long  s=0;
 7 void hhh(int x,int y,int z)
 8 {
 9     int l=x;
10     int k=0;
11     int mid=y;
12     int l1=y+1;
13     while(l<=mid&&l1<=z)
14     {
15         if(a[l]<a[l1])
16             b[k++]=a[l++];
17         else
18         {
19             s+=(mid-l)+1;
20             b[k++]=a[l1++];
21 
22         }
23     }
24     while(l<=mid)
25         b[k++]=a[l++];
26     while(l1<=z)
27         b[k++]=a[l1++];
28     for(int i=0;i<k;i++)
29         a[x++]=b[i];
30 }
31 void hh(int x,int y)
32 {
33     if(x==y)
34         return ;
35    hh(x,(x+y)/2);
36    hh((x+y)/2+1,y);
37    hhh(x,(x+y)/2,y);
38 }
39 
40 int main()
41 {
42     scanf("%d",&n);
43     for(int i=1;i<=n;i++)
44         scanf("%d",&a[i]);
45     hh(1,n);
46     cout<<s<<endl;
47 }

 

posted on 2017-06-08 10:27  hhhhx  阅读(202)  评论(0编辑  收藏  举报

导航