POJ 3928 Ping pong

题目链接:http://poj.org/problem?id=3928

乒乓比赛,有N个人参加,输入每个玩家的技能等级,对每个人设置一个特定ID和一个技能值,一场比赛需要两个选手和一个裁判,只有当裁判的ID和技能值都在两个选手之间的时候才能进行一场比赛,现在问一共能组织多少场比赛。

参考的其他人的代码,重新敲了一遍。

/*POJ 3928

Ping pong

*/

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;



#define N 23000

int c[N],n;

long long int ans;



struct Node

{

    int id;

    int level;

} node[N];



bool cmp(Node a,Node b)

{

    return a.level<b.level;

}



int lowbit(int x)

{

    return x & (-x);

}



void update(int i,int val)

{

    while(i<=n)

    {

        c[i]+=val;

        i+=lowbit(i);

    }

}



int sum(int i)

{

    int s=0;

    while(i>0)

    {

        s+=c[i];

        i-=lowbit(i);

    }

    return s;

}



int main()

{

    int T;

    scanf("%d",&T);

    while(T--)

    {

        scanf("%d",&n);

        for(int i=1; i<=n; i++)

        {

            scanf("%d",&node[i].level);

            node[i].id=i;

        }

        sort(node+1,node+1+n,cmp);

        memset(c,0,sizeof(c));

        ans=0;

        long long l,r;

        for(int i=1; i<=n; i++)

        {

            l=sum(node[i].id);

            r=sum(n)-l;

            ans+=(l*(n-node[i].id-r)+r*(node[i].id-1-l));

            update(node[i].id,1);

        }

        printf("%lld\n",ans);

    }

    return 0;

}

 

 

你可能感兴趣的:(ping)