• 大于它的个数和小于它的个数(树状数组)


     1 #include <bits/stdc++.h>
     2 #define ll long long
     3 using namespace std;
     4 int n,m;
     5 const int N=100005;
     6 ll cnt[N],arr[N],brr[N];
     7 vector<ll> vec;
     8 int getid(ll x) { return lower_bound(vec.begin(),vec.end(),x)-vec.begin()+1; }
     9 int lowbits(int x) { return x&-x; }
    10 void add(int x,int value){ while(x<=N) cnt[x]+=value,x+=lowbits(x); }
    11 int query(int x){
    12     int sum=0;
    13     while(x>0){ sum+=cnt[x],x-=lowbits(x); }
    14     return sum;
    15 }
    16 int main(){
    17     scanf("%d",&n);
    18     for(int i=1;i<=n;i++) scanf("%lld",&arr[i]),vec.push_back(arr[i]);
    19     sort(vec.begin(),vec.end());vec.erase(unique(vec.begin(),vec.end()),vec.end());
    20     ll sum=0;
    21     for(int i=1;i<=n;i++){
    22         add(getid(arr[i]),1);
    23         brr[i]+=i-query(getid(arr[i]));  //i-小于等于的它的个数就是前面大于它的个数
    24     }
    25 //    memset(brr,0,sizeof(brr));
    26     memset(cnt,0,sizeof(cnt));
    27     for(int i=n;i>=1;i--){
    28         add(getid(arr[i]),1);
    29         brr[i]+=query(getid(arr[i])-1);   //后面小于它的个数
    30 //        cout << brr[i] << endl;
    31     }
    32     for(int i=1;i<=n;i++){
    33         sum+=1LL*(1+brr[i])*brr[i]/2;
    34     }
    35     cout << sum << endl;
    36     return 0;
    37 }
    View Code
  • 相关阅读:
    CSS3实现轮播切换效果
    angularjs directive
    angularjs 迭代器
    anjularjs 路由
    sublime text3 快捷键设置
    如何使用git 跟进项目进程
    hdu 4842(NOIP 2005 过河)之 动态规划(距离压缩)
    叠箱子问题 之 动态规划
    华为oj 之 蜂窝小区最短距离
    华为oj 之 整数分隔
  • 原文地址:https://www.cnblogs.com/qq-1585047819/p/11420383.html
Copyright © 2020-2023  润新知