hdu 2492後綴數組

原題鏈接:點擊打開鏈接

#include <stdio.h>  
#include <string.h>  
  
#define MAX 100001  
  
int arr[MAX];  
int left_bigger[MAX], right_bigger[MAX], left_lower[MAX], right_lower[MAX];  
  
int lowbit(int i)  
{  
    return i&(-i);  
}  
  
void update(int x, int i)  
{  
    while(x <= MAX){  
        arr[x] += i;  
        x += lowbit(x);  
    }  
}  
  
int sum(int i)  
{  
    int ans = 0;  
    while(i > 0){  
        ans += arr[i];  
        i -= lowbit(i);  
    }  
    return ans;  
}  
  
int main()  
{  
  
    __int64 res;  
    int t, n, i;  
      
    int skill[MAX];  
    scanf("%d", &t);  
    while(t--){  
        scanf("%d", &n);  
        for(i = 1; i <= n; i ++){  
            scanf("%d", &skill[i]);  
        }  
        res = 0;  
        memset(arr, 0, sizeof(arr));  
        for(i = 1; i <= n; i ++){  
            update(skill[i], 1);    
            left_lower[i] = sum(skill[i]-1);  
            left_bigger[i] = i - 1 - left_lower[i];
        }  
        memset(arr, 0, sizeof(arr));  
        for(i = n; i > 0; i --){  
            update(skill[i], 1);  
            right_bigger[i] = sum(MAX)-sum(skill[i]);  
            right_lower[i] = n - i - right_bigger[i];
        }  
        for(i = 1; i <= n; i ++){  
            res += left_bigger[i]*right_lower[i]+left_lower[i]*right_bigger[i];  
        }  
        printf("%I64d\n", res);  
    }  
    return 0;  
}  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章