題目: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);
}
}