uvalive 4329 Ping pong 树状数组
2014-08-02 13:25
267 查看
题意:
有n个打乒乓球的人,住在一排房子内,以房子的顺序从做到由,每个人都有一个不同的乒乓球等级ai。每次比赛需要三人,两人比赛和一人裁判,裁判必须居住在两个比赛者之间,且等级必须也在两个人之间。问最多可以进行多少场比赛。
题解:
对于第i个人,我们找出它位置之前比它等级低的人数f[0][i],它之后比它等级低的人数f[1][i],那么以i为裁判的比赛有s[i]=f[0][i]*(n-i-1-f[1][i])+(i-f[0][i])*f[1][i];那么答案就是ans=∑ s[i]。接着问题就只是求f数组了,对于f[0][i],我们从左开始遍历ai,每次将b[ai+=1(b初始为0),那么i位置之前等级比ai低的人数就是b[1]+b[2]+...+b[ai]。这样我们就可以用树状数组求得了;同理我们可以倒着遍历求得f[1][i]。时间复杂度nlogn。
树状数组:
lowbit(x)表示求得x的二进制情况下最后一个1所代表的数,例如lowbit(12)=4;
add(x,val)为b[x]+=val;
sum(x)为求得b[1]+b[2]+...+b[x]。
c[x]表示∑bk(x-lowbit(x)<=k<=x)
详细的请自己理解和百度吧。
代码:
有n个打乒乓球的人,住在一排房子内,以房子的顺序从做到由,每个人都有一个不同的乒乓球等级ai。每次比赛需要三人,两人比赛和一人裁判,裁判必须居住在两个比赛者之间,且等级必须也在两个人之间。问最多可以进行多少场比赛。
题解:
对于第i个人,我们找出它位置之前比它等级低的人数f[0][i],它之后比它等级低的人数f[1][i],那么以i为裁判的比赛有s[i]=f[0][i]*(n-i-1-f[1][i])+(i-f[0][i])*f[1][i];那么答案就是ans=∑ s[i]。接着问题就只是求f数组了,对于f[0][i],我们从左开始遍历ai,每次将b[ai+=1(b初始为0),那么i位置之前等级比ai低的人数就是b[1]+b[2]+...+b[ai]。这样我们就可以用树状数组求得了;同理我们可以倒着遍历求得f[1][i]。时间复杂度nlogn。
树状数组:
lowbit(x)表示求得x的二进制情况下最后一个1所代表的数,例如lowbit(12)=4;
add(x,val)为b[x]+=val;
sum(x)为求得b[1]+b[2]+...+b[x]。
c[x]表示∑bk(x-lowbit(x)<=k<=x)
详细的请自己理解和百度吧。
代码:
#include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <iostream> #include <algorithm> #include <vector> #include <map> #include <queue> #include <stack> using namespace std; #define lowbit(x) (x&(-x)) #define LL long long const int maxn=1e5+10; int c[maxn]; int a[maxn],f[2][maxn]; void add(int x,int val)//b[x]+=val { while(x<maxn) { c[x]+=val; x+=lowbit(x); } } int sum(int x)//b[1]+b[2]+...b[x] { int ans=0; while(x>0) { ans+=c[x]; x-=lowbit(x); } return ans; } int main() { int T; scanf("%d",&T); while(T--) { int i,j,k,n; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); memset(c,0,sizeof(c)); for(i=0;i<n;i++) { f[0][i]=sum(a[i]); add(a[i],1); //printf("%d %d:%d\n",0,i,f[0][i]); } memset(c,0,sizeof(c)); for(i=n-1;i>=0;i--) { f[1][i]=sum(a[i]); add(a[i],1); //printf("%d %d:%d\n",0,i,f[0][i]); } LL ans=0; for(i=0;i<n;i++) { ans+=(LL)f[0][i]*(n-i-1-f[1][i]); ans+=(LL)(i-f[0][i])*f[1][i]; } printf("%lld\n",ans); } return 0; }
相关文章推荐
- UVALive - 4329 Ping pong 树状数组
- UVALive 4329 Ping pong
- UVALive 4329 Ping pong(树状数组求逆序数+顺序数)
- UVALive 4329 Ping pong(树状数组)
- UVALive - 4329 Ping pong (树状数组)
- UVALive - 4329 Ping pong (树状数组)
- 树状数组(LA4329,UVaLive4329,Ping pong)
- UVALive 4329 Ping pong
- UVALive - 4329 树状数组
- UVALive - 4329 Ping pong 数状数组
- [UVALive4329] Ping pong(树状数组,组合)
- 【暑假】[实用数据结构]UVAlive 4329 Ping pong
- UVALive-4329 Ping pong (树状数组)
- UVALive 4329 Ping pong(树状数组)
- 【暑假】[实用数据结构]UVAlive 4329 Ping pong
- UVALive 4329 Ping pong(解法二:树状数组)
- UVALive 4329 Ping pong (BIT)
- uvalive 4329 Ping Pong(树状数组)
- UVALIVE 4329 Ping pong(树状数组)
- uvalive 4329 Ping pong (树状数组)