• 洛谷—— P1908 逆序对


    https://www.luogu.org/problem/show?pid=1908

    题目描述

    猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计。最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定义的:对于给定的一段正整数序列,逆序对就是序列中ai>aj且i<j的有序对。知道这概念后,他们就比赛谁先算出给定的一段正整数序列中逆序对的数目。

    输入输出格式

    输入格式:

    第一行,一个数n,表示序列中有n个数。

    第二行n个数,表示给定的序列。

    输出格式:

    给定序列中逆序对的数目。

    输入输出样例

    输入样例#1:
    6
    5 4 2 6 3 1
    
    输出样例#1:
    11

    说明

    对于50%的数据,n≤2500

    对于100%的数据,n≤40000。

    将原数组离散化后,用离散后的数字当做树状数组的下标(可能会有很大的数),然后就是树状数组模板求逆序对了

    没有离散得了10分~

    inline 貌似不能加速

     1 #include <algorithm>
     2 #include <cstdio>
     3 
     4 #define lowbit(x) (x&(-x))
     5 
     6 using namespace std;
     7 
     8 const int N(40000+15);
     9 int n,x,c[N],ans;
    10 struct Node
    11 {
    12     int num,mark;
    13 }a[N];
    14 
    15 bool cmp(Node a,Node b)
    16 {
    17     return a.num>b.num;
    18 }
    19 
    20 inline void up(int x)
    21 {
    22     for(;x<=N;x+=lowbit(x)) c[x]++;
    23 }
    24 
    25 inline int query(int x)
    26 {
    27     int ret=0;
    28     for(;x;x-=lowbit(x)) ret+=c[x];
    29     return ret;
    30 }
    31 
    32 int main()
    33 {
    34     scanf("%d",&n);
    35     for(int i=1;i<=n;i++)
    36         scanf("%d",&a[i].num),a[i].mark=i;
    37     sort(a+1,a+n+1,cmp);
    38     for(int i=1;i<=n;i++)
    39     {
    40 
    41         ans+=query(a[i].mark);
    42         up(a[i].mark);
    43     }
    44     printf("%d",ans);
    45     return 0;
    46 }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    阐述:SIP协议是什么
    【SIP协议】学习初学笔记
    【协议学习】SIP基本场景分析
    电话的前世今生
    深入浅出SIP协议
    QVariant类及QVariant与自定义数据类型转换的方法
    Qt中如何根据类名来实例化对象
    模板的全特化与偏特化
    为什么c++中,有时可以用类名直接访问非静态成员函数?
    C++引用详解
  • 原文地址:https://www.cnblogs.com/Shy-key/p/6930563.html
Copyright © 2020-2023  润新知