码迷,mamicode.com
首页 > 其他好文 > 详细

hzwer与逆序对

时间:2017-06-02 21:14:42      阅读:309      评论:0      收藏:0      [点我收藏+]

标签:输出   etc   har   namespace   hint   png   数据   fine   iostream   

codevs——4163 hzwer与逆序对

 貌似这个题和上个题是一样的((⊙o⊙)…)

 时间限制: 1 s
 空间限制: 256000 KB
 题目等级 : 黄金 Gold
 
 
 
题目描述 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<cstdio>
#include<iostream>
#include<algorithm>
#define N 1000001
using namespace std;
int n,a[N],tmp[N];
long long ans;
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<0||ch>9)
    {
        if(ch==-) f=-1;
        ch=getchar();
    }
    while(ch>=0&&ch<=9)
    {
        x=x*10+ch-0;
        ch=getchar();
    }
    return x*f;
}
void gsort(int l,int r)
{
    if(l==r) return ; int mid=(l+r)/2;
    gsort(l,mid);gsort(mid+1,r);
    int i=l,j=mid+1,k=l;
    while(i<=mid&&j<=r)
    {
        if(a[i]<=a[j]) tmp[k++]=a[i++];
        else
        {
            ans+=(long long)(mid-i+1);
            tmp[k++]=a[j++];    
        }
    }
    while(i<=mid) tmp[k++]=a[i++];
    while(j<=r) tmp[k++]=a[j++];
    for(int i=l;i<=r;i++) a[i]=tmp[i];
 }
int main()
{
    n=read();
    for(int i=1;i<=n;i++) a[i]=read();
    gsort(1,n);
    cout<<ans;
    return 0;
}

 

hzwer与逆序对

标签:输出   etc   har   namespace   hint   png   数据   fine   iostream   

原文地址:http://www.cnblogs.com/z360/p/6931013.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!