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;
}
posted @ 2012-10-05 09:34  等待电子的砹  阅读(185)  评论(0编辑  收藏  举报