题目链接: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; }
POJ 3928 Ping pong,布布扣,bubuko.com
原文:http://www.cnblogs.com/man1304010109/p/3597208.html