POJ 1007
一道略水的题,用树状数组求逆序数,放在这里当作模板,方便以后重用。
当时把树状数组的记录求和的数组开小了,一直WA,太粗心。
#include<stdio.h> #include<string.h> #include<stdlib.h> #define MAX_LEN 160 #define MAX_DNA 110 #define MAX_RECRD 200 struct node { int val; char str[MAX_LEN]; }dna[MAX_DNA]; int getValue(char *,int),get_sum(int),cmp(const void *,const void *),recrd[MAX_RECRD]; void update(int,int,int); inline int lowbit(int); int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { getchar(); int i; for(i=0;i<m;i++) { scanf("%s",dna[i].str); dna[i].val=getValue(dna[i].str,n); } qsort(dna,m,sizeof(struct node),cmp); for(i=0;i<m;i++) printf("%s\n",dna[i].str,dna[i].val); } return 0; } int getValue(char *dest,int length) { int i,ans=0; memset(recrd,0,sizeof(recrd)); for(i=0;i<length;i++) { update(dest[i]-'A'+1,1,length); ans+=i-get_sum(dest[i]-'A'+1)+1; } return ans; } void update(int x,int val,int length) { int i; for(i=x;i<MAX_RECRD;i+=lowbit(i)) { recrd[i]+=val; } } int get_sum(int x) { int i,tmp=0; for (i=x;i>0;i-=lowbit(i)) { tmp+=recrd[i]; } return tmp; } inline int lowbit(int x) { return x&(-x); } int cmp(const void *x,const void *y) { return (*(struct node *)x).val-(*(struct node *)y).val; }