您的位置:首页 > 其它

LA 4329 Ping pong

2016-04-18 19:57 267 查看
读题之后 首先是没有思路 看了书上的思路之后, 还是不大懂, 终于》》》 看了大神的代码之后才懂一点点

下面是我改过的代码~~~~

题意:

一条大街上住着n个乒乓球爱好者,经常组织比赛。每个人都有一个技能值ai,每场比赛需要3个人:两名选手和一名裁判。规定裁判位置必须在两个选手的中间,而且技能值也必须在两个选手的中间,问一共能组织多少种比赛


思路:

考虑第i个人当裁判的情形,假设a1到a[i-1]中有ci个比ai小,那么就有(i-1)-ci个比ai大,同理,假设a[i+1]到an中有di个比ai小,那么就有(n-i)-di个比ai大,然后根据乘法原理和加法原理,i当裁判有ci(n-i-di)+(i-ci-1)*di,这样问题就转化为求c,d

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

///#define N 1000000 ************ 之前N一直开10000结果程序一直崩, 我都要崩溃了, 发现错误是这之后
const int N = 10000000;************我都要哭了
#define lowbit(x) (x&-x)

int a
,c
;
int s1
,s2
;

int sum(int x)
{
int ret = 0;
while(x>0)
{
ret+=c[x];
x-=x&(-x);
}
return ret;
}

void add(int x,int d)
{
while(x<=100005)
{
c[x]+=d;
x+=x&(-x);
}
}
int main()
{
int T;
int n;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(int i=1; i<=n; i++)
scanf("%d", &a[i]);
memset(c, 0, sizeof(c));///清空数组
for(int i=1; i<=n; i++)///所有的数都加1
{
add(a[i], 1);///a[i]一次次加1,
s1[i] = sum(a[i]-1);///求和 , 和能计数,计算比a[i]小的个数, 感觉不是很好理解
}
memset(c, 0, sizeof(c));///清空数组
for(int i=n; i>=1; i--)
{
add(a[i], 1);
s2[i] = sum(a[i]-1);
}
long long ans = 0;
for(int i=2; i<=n; i++)
{
ans += s1[i]*(n-i-s2[i])+s2[i]*(i-s1[i]-1);///乘法原理和加法原理
}
printf("%lld\n", ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: