zoukankan      html  css  js  c++  java
  • codevs 4163 hzwer与逆序对

    传送门

    题目描述 Description

    hzwer在研究逆序对。

    对于数列{a},如果有序数对(I,j)满足:i<j,a[i]>a[j],则(i,j)是一对逆序对。

    给定一个数列{a},求逆序对个数。

    输入数据较大,请使用scanf代替cin读入。

    *为防卡评测,时限调低至1s

    输入描述 Input Description

    第一行一个数n,表示{a}有n个元素。

    接下来n个数,描述{a}。

    输出描述 Output Description

    一个数,表示逆序对个数。

    样例输入 Sample Input

    5

    3 1 5 2 4

    样例输出 Sample Output

    4

    数据范围及提示 Data Size & Hint

    对于10%数据,1<=n<=100.

    对于20%数据,1<=n<=10000.

    对于30%数据,1<=n<=100000.

    对于100%数据,1<=n<=1000000,1<=a[i]<=10^8.

    tips:我没有想故意卡你们时限。一点这样的意思都没有。你们不要听风就是雨……

    题解;归并排序求逆序对。

    #include<iostream>
    using namespace std;
    int a[1000001],b[1000001];
    long long ans;
    void msort(int l,int r)
    {
          if (l>=r) return;
          int mid=(l+r)/2;
          msort(l,mid);
          msort(mid+1,r);
          int i=l,j=mid+1,t=l-1;
          while(i<=mid&&j<=r)//小为先,指针进。 
          {
              if(a[i]<=a[j]) b[++t]=a[i++];
              else
              {
                  ans+=mid-i+1;
                  b[++t]=a[j++];
              }
          }
          while (i<=mid) b[++t]=a[i++];//大为后,直接补。 
          while (j<=r) b[++t]=a[j++];
          for (i=l;i<=r;i++) a[i]=b[i];
          return;
    }
    int main()
    {
            int n,m,i,j,k;
            cin>>n;
            for(i=1;i<=n;i++)  cin>>a[i];
            msort(1,n);
            cout<<ans<<endl;
            return 0;
    }
    归并排序逆序对
  • 相关阅读:
    菜鸟版JAVA设计模式—从买房子看代理模式
    NTP工作机制及时间同步的方法
    Java工厂模式
    圣魔大战3(Castle Fantisia)艾伦希亚战记完美攻略
    对javabean的内省操作
    插入排序(insertion sort)
    中英文对照 —— 十二星座
    中英文对照 —— 十二星座
    数学归纳法的相关证明
    数学归纳法的相关证明
  • 原文地址:https://www.cnblogs.com/sjymj/p/6040465.html
Copyright © 2011-2022 走看看