zoukankan      html  css  js  c++  java
  • LA 4329 pingpong 树状数组

    LA 4329 pingpong

    P197

    树状数组统计,统计数组中,一个值的左边比它小的个数

    用乘法原理求方法总数。

    注意

      N个数互不相同(distinct)

      因为,最大值有限。可以利用树状数组统计。 

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 
     6 #define lowbit(x) ((x)&(-(x)))
     7 using namespace std;
     8 
     9 const int max_a=100000+1000;
    10 const int max_num=20000+200;
    11 
    12 typedef long long LL;
    13 
    14 int a[20000+200];
    15 LL cc[20000+200],dd[20000+200];
    16 int n=max_a,C[max_a];
    17 
    18 int sum(int x) {
    19     int ret = 0;
    20     while ( x>0 ) {
    21         ret += C[x];
    22         x -= lowbit(x);
    23     }
    24     return ret;
    25 }
    26 
    27 void add(int x, int d) {
    28     while(x <= n) {
    29         C[x] += d;
    30         x += lowbit(x);
    31     }
    32 }
    33 
    34 int main()
    35 {
    36     //freopen("input.txt","r",stdin);
    37     int T;cin>>T;
    38     int num;
    39     for(int tt=1;tt<=T;tt++) {
    40         scanf("%d",&num);
    41         for(int i=0;i<num;i++)
    42             scanf("%d",&a[i]);
    43 
    44 
    45         memset(C,0,sizeof(C));
    46         for(int i=0;i<num;i++) {
    47             add(a[i],1);
    48             cc[i]=sum(a[i])-1;//cout<<cc[i]<<endl;
    49         }
    50         memset(C,0,sizeof(C));
    51         for(int i=num-1;i>=0;i--) {
    52             add(a[i],1);
    53             dd[i]=sum(a[i])-1;//cout<<cc[i]<<endl;
    54         }
    55         long long ans=0;
    56         for(int i=1;i<num-1;i++) {
    57             ans+=(cc[i])*(num-(1+i)-dd[i])+
    58                  (i-cc[i])*(dd[i]);
    59         }
    60         cout<<ans<<endl;
    61     }
    62     return 0;
    63 }
    //from http://code.google.com/p/aoapc-book/source/browse/TrainingGuide/bookcodes/ch3/la4329.cpp?spec=svn16d535c9811a6d2b26c1fbb2ba40fce4359a4d01&r=16d535c9811a6d2b26c1fbb2ba40fce4359a4d01
    
    inline int lowbit(int x) { return x&-x; }
    
    struct FenwickTree {
      int n;
      vector<int> C;
    
      void resize(int n) { this->n = n; C.resize(n); }
      void clear() { fill(C.begin(), C.end(), 0); }
    
      // ¼ÆËãA[1]+A[2]+...+A[x] (x<=n)
      int sum(int x) {
        int ret = 0;
        while(x > 0) {
          ret += C[x]; x -= lowbit(x);
        }
        return ret;
      }
    
      // A[x] += d (1<=x<=n)
      void add(int x, int d) {
        while(x <= n) {
          C[x] += d; x += lowbit(x);
        }
      }
    };

    BIT(Binary Indexed Tree)又名 Fenwick Tree

    二叉搜索树可以完成这个任务吗?eg use STL/python的set

    插入节点,返回比它小的数的个数。

  • 相关阅读:
    博客园美化-打赏代码
    苹果appID的获取方法
    简体、繁体相互转换
    iOS Socket编程(一)基本概念
    无线通信
    http与https通信
    iOS开发网络篇—发送GET和POST请求(使用NSURLSession)
    iOS开发网络篇—GET请求和POST请求的说明与比较
    iOS开发网络篇—HTTP协议
    Verify the Developer App certificate for your account is trusted on your device.
  • 原文地址:https://www.cnblogs.com/mmqh/p/2914534.html
Copyright © 2011-2022 走看看