離散化&&逆序數對

題目:http://120.78.128.11/Problem.jsp?pid=3087

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define lowbit(x) x&(-x)
int c[100100], n;
long long F[100100], a[100100];
void updata(int i, int v)
{
    while(i<=n)
    {
        c[i]+=v;
        i+=lowbit(i);
    }
}
int getsum(int i)
{
    int sum=0;
    while(i>0)
    {
        sum+=c[i];
        i-=lowbit(i);
    }
    return sum;
}
int main( )
{
    int i, j, T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);
        long long ans=0;
        memset(c, 0 ,sizeof(c));
        n++;
        a[1]=0;
        for(i=2; i<=n; i++)
        {
            scanf("%lld", &a[i]);
            a[i]+=a[i-1];
        }
        for(i=1; i<=n; i++)
        {
            a[i]=a[i]*10010+i;///防止數字重複
            F[i]=a[i];
        }
        sort(a+1, a+n+1);
        for(i=1; i<=n; i++)
            F[i]=lower_bound(a+1, a+1+n, F[i])-a;///尋找該數字在的位置,那個位置就是改位置新的值
        for(i=1; i<=n; i++)
        {
            ans+=getsum(F[i]);
            updata(F[i], 1);
        }
        printf("%lld\n", ans);
    }
}

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