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

     时间限制: 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:我没有想故意卡你们时限。一点这样的意思都没有。你们不要听风就是雨……

    比赛已结束 详细解析见题解

    分类标签 Tags 

    连树状数组求逆序对我都不会写了,,好弱啊

    关于怎么实现,推荐一篇博客

    http://www.cnblogs.com/xiongmao-cpp/p/5043340.html

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #define LL long long 
     7 #define lb(x)    ((x)&(-x))
     8 using namespace std;
     9 const int MAXN=40000001;
    10 inline int read()
    11 {
    12     char c=getchar();int x=0,f=1;
    13     while(c<'0'||c>'9')    {if(c=='-')    f=-1;c=getchar();}
    14     while(c>='0'&&c<='9')    x=x*10+c-48,c=getchar();return x*f;
    15 }
    16 int n;
    17 int tree[MAXN];
    18 int a[MAXN];
    19 int data[MAXN];
    20 inline void Point_Add(int pos,int val)
    21 {
    22     while(pos<=n)
    23     {
    24         tree[pos]+=val;
    25         pos+=lb(pos);
    26     }
    27 }
    28 inline int Interval_Sum(int pos)
    29 {
    30     int ans=0;
    31     while(pos)
    32     {
    33         ans+=tree[pos];
    34         pos-=lb(pos);
    35     }
    36     return ans;
    37 }
    38 int main()
    39 {
    40     n=read();LL ans=0;
    41     for(int i=1;i<=n;i++)    a[i]=read(),data[i]=a[i];
    42     int num=unique(data,data+n+1)-data-1;
    43     sort(data+1,data+n+1);
    44     for(int i=1;i<=n;i++)    a[i]=lower_bound(data+1,data+num+1,a[i])-data;
    45     for(int i=1;i<=n;i++)
    46     {
    47         Point_Add(a[i],1);
    48         ans+=i-Interval_Sum(a[i]);
    49     }
    50     printf("%lld",ans);
    51     return 0;
    52 }
  • 相关阅读:
    2020软件工程作业02
    自我介绍
    Requests的使用
    爬虫基本原理
    2019春总结作业
    十二周作业
    十一周作业
    第十周作业
    intellij idea 的全局搜索快捷键方法
    Oracle多表关联
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/7709659.html
Copyright © 2011-2022 走看看