zoukankan      html  css  js  c++  java
  • sub

    求逆序对是枚举一个数,统计前面有多少数小于它

    这个用乘法原理,统计左右小于或大于它的

    要用树状数组,但数太大数组开不下,要离散化

    A[0]存储的是是0的数有多少个

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 typedef long long ll;
     5 const ll mod = 1e9 + 7;
     6 int n;
     7 int tmp[200005], a[200005];
     8 int bit1[200005], bit2[200005];
     9 
    10 inline int lowbit(int x){
    11     return x & -x;
    12 }
    13 
    14 void add(int *bit, int pos, int v){
    15     for(int i = pos; i <= n; i += lowbit(i)){
    16         bit[i] += v;
    17     }
    18 }
    19 int query(int *bit, int pos){
    20     int ret = 0;
    21     for(int i = pos; i; i -= lowbit(i)){
    22         ret += bit[i];
    23     }
    24     return ret;
    25 }
    26 ll ans = 0;
    27 int main(){
    28     scanf("%d", &n);
    29     for(int i = 1; i <= n; i ++){
    30         scanf("%d", &a[i]); tmp[i] = a[i];
    31     }
    32     sort(tmp + 1, tmp + n + 1);
    33     for(int i = 1; i <= n; i ++){
    34         a[i] = lower_bound(tmp + 1, tmp + n + 1, a[i]) - tmp;
    35         add(bit2, a[i], 1);
    36     }
    37     for(int i = 1; i <= n; i ++){
    38         add(bit2, a[i], -1);
    39         ans = (ans + 1ll * query(bit1, a[i] - 1) * (query(bit2, n) - query(bit2, a[i]))) % mod;
    40         ans = (ans + 1ll * query(bit2, a[i] - 1) * (query(bit1, n) - query(bit1, a[i]))) % mod;
    41         add(bit1, a[i], 1); 
    42     }
    43     printf("%lld
    ", ans);
    44     return 0;
    45 }

     树状数组求逆序对的这种方法暑假在清北就听过,然而什么都不记了...

    这是能力的问题,更是态度的问题

  • 相关阅读:
    [转载]为 Windows 下的 PHP 安装 PEAR 和 PHPUnit
    作品和案例
    js创建对象的最佳实践
    log4j的PatternLayout参数含义
    Java线程池——ThreadPoolExecutor的使用
    登录mysql 报 Access denied for user 'root'@'localhost' 错误
    CentOS 7下使用yum安装MySQL5.7
    linux下MySQL停止和重启
    Linux 命令 -- chown
    Linux 命令 -- chmod
  • 原文地址:https://www.cnblogs.com/lcan/p/9534728.html
Copyright © 2011-2022 走看看