首页 > 编程语言 > 详细

RMQ、树状数组板子

时间:2017-02-21 15:38:45      阅读:242      评论:0      收藏:0      [点我收藏+]
/*         ggg   ggg
        ggggggg ggggggg
      ggggggggggggggggggg
        ggggggggggggggg
          ggggggggggg
            ggggggg
              ggg
               g
*/
/*  gyt
       Live up to every day            */

#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<cstring>
#include<queue>
#include<set>
#include<string>
#include<map>
#include <time.h>
#define PI acos(-1)
using namespace std;
typedef long long ll;
typedef double db;
const int maxn = 1e5+5;
const ll maxm = 1e7;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f;
const ll inf = 1e15 + 5;
const db eps = 1e-9;
int c[maxn], a[maxn], n, ca=1;
ll l[maxn], lm[maxn];
/*void RMQ_init() {
    for (int i = 1; i <= n; i++) {
        dmax[i][0] = dmin[i][0] = a[i];
    }
    for (int j = 1; (1<<j) <= n; j++) {
        for (int i = 1; i+(1<<j)-1<=n; i++) {
            dmax[i][j] = max(dmax[i][j-1], dmax[i+(1<<(j-1))][j-1]);
            dmin[i][j] = min(dmin[i][j-1], dmin[i+(1<<(j-1))][j-1]);
        }
    }
}
int RMQma(int l, int r) {
    int k = 0;
    while((1<<(k+1))<=r-l+1)  k++;
    return max(dmax[l][k], dmax[r-(1<<k)+1][k]);
}
int RMQmi(int l, int r) {
    int k = 0;
    while((1<<(k+1))<=r-l+1)  k++;
    return min(dmin[l][k], dmin[r-(1<<k)+1][k]);
}*/
int lowbit(int x) {
    return x&-x;
}
int sum(int x) {
    int ret=0;
    while(x>0) {
        ret+=c[x], x-=lowbit(x);
    }
    return ret;
}
void add(int x, int d) {
    while(x<maxn) {
        c[x] += d;  x+=lowbit(x);
    }
}
void solve() {
    scanf("%d", &n);
    memset(c, 0, sizeof(c));
    for (int i = 1; i <= n; i++) {
        scanf("%d", a+i);
    }
    ll ans=0;
    for (int i = 1; i <= n; i++) {
        l[i] = sum(a[i]);
        lm[i] = i-1-l[i];
        add(a[i], 1);
    }
    memset(c, 0, sizeof(c));
    for (int i = n; i > 0; i--) {
        ll tmp=sum(a[i]);
        ans += tmp*lm[i];
        tmp = n-i-tmp;
        ans += (tmp)*l[i];
        add(a[i], 1);
    }
    cout << ans << endl;
}
int main() {
    int t = 1;
    scanf("%d", &t);
    while(t--)
        solve();
    return 0;
}

 

RMQ、树状数组板子

原文:http://www.cnblogs.com/gggyt/p/6424013.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!