离散化&&逆序数对
题目: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); } }