树状数组(乒乓比赛,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;
}
【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;
}
相关文章推荐
- LA 4329 乒乓比赛
- LA 4329 Ping pong乒乓比赛【树状数组】
- LA 4329 - Ping pong 树状数组(Fenwick树)
- 树状数组 LA 4329 亚洲赛北京赛区题
- LA 4329 - Ping pong 树状数组(Fenwick树)
- LA 4329 Ping pong 树状数组
- LA 4329 - Ping pong 树状数组
- LA 4329 Ping pong / 树状数组
- LA 4329 树状数组
- LA 4329 树状数组(BIT) 维护更新一段区间的前缀和
- LA4329乒乓比赛_树状数组
- LA4329 乒乓比赛(树状数组)(训练指南)
- (LA 4329) Ping Pang --树状数组
- 两个乒乓球队进行比赛,各出三人。甲队为A、B、C 3人,乙队为X、Y、Z 3人。已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X、Y比,请编程序找出3三队选手的对阵名单
- LA-4329 Ping pong - treap (排名树)/树状数组求排名
- 题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。 a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
- 2018年全国多校算法寒假训练营练习比赛(第五场)-E:情人节的电灯泡(二维树状数组)
- LA 4329 Ping pong
- 【程序22】两个乒乓球队进行比赛
- LA 5902 - Movie collection 树状数组(Fenwick树)