离散化&&逆序数对

题目:http://www.fjutacm.com/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);
    }
}
辣鸡代码

 

posted @ 2018-03-08 20:53  Thanks_up  阅读(139)  评论(0编辑  收藏  举报