您的位置:首页 > 其它

树状数组(乒乓比赛,LA 4329)

2016-12-09 14:44 447 查看
这道题不禁让我想起了    
【2016-大连赛区网络赛-J】线段树,dfs(Weak Pair,hdu 5877)

那道题是一边dfs,一边计算,一边维护线段树。

这道题是一边循环,一边计算,一边维护树状数组。

题目要求只要裁判在中间就好了,我理解成升序。。。WA

很多时候如果找不到错误数据,就要好好想想是不是有些地方想当然,然后理解错了。

看代码理解比较好。

代码

#include<bits/stdc++.h>
#define f(i) for(ll i=1;i<=n;i++)
#define s(a) scanf("%lld",&a)
#define ss(a) for(ll i=1;i<=n;i++) scanf("%lld",a+i)
#define maxn 20010
using namespace std;
typedef long long ll;

ll n;
ll a[maxn],b[maxn];
ll l[maxn],r[maxn];

ll low_bit(ll x)
{
return x&-x;
}

void add(ll* t,ll p,ll v)
{
while(p<=n)
{
t[p]+=v;
p+=low_bit(p);
}
}

ll sum(ll* t,ll p)
{
ll ret=0;
while(p>0)
{
ret+=t[p];
p-=low_bit(p);
}
return ret;
}

ll qry(ll* t,ll l,ll r)
{
return sum(t,r)-sum(t,l-1);
}

int main()
{
ll T;
s(T);
while(T--)
{
s(n);
ss(a);
f(i) b[i]=a[i];
sort(b+1,b+1+n);
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
for(ll i=2;i<=n;i++)
{
ll p=lower_bound(b+1,b+1+n,a[i])-b;
add(r,p,1);
}
ll ans=0;
f(i)
{
ll p=lower_bound(b+1,b+1+n,a[i])-b;
ans+=qry(l,1,p-1)*qry(r,p+1,n)+qry(l,p+1,n)*qry(r,1,p-1);
add(l,p,1);
p=lower_bound(b+1,b+1+n,a[i+1])-b;
add(r,p,-1);
}
printf("%lld\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: