您的位置:首页 > 其它

模拟赛 弱点(时间限制:2S;空间限制:256MB)

2014-11-04 17:04 260 查看

题目描述

一队勇士正在向你进攻,每名勇士都有一个战斗值ai。但是这队勇士却有一个致命弱点,如果存在i<j<k使得ai>aj>ak,则会影响他们整体的战斗力。我们将这样的一组(i,j,k)称为这队勇士的一个弱点。请求出这队勇士的弱点数目。

输入

输入文件:weakness.in

输入的第一行是一个整数n,表示勇士的数目。

接下来一行包括n个整数,表示每个勇士的战斗值ai。

输出

输入文件:weakness.out

输出为一行,包含一个整数。表示这队勇士的弱点数目。

输入样例

4

10 8 3 1

输出样例

4

数据范围

对于30%的数据,3<=n<=100

对于100%的数据,3<=n<=1000000

对于100%的数据,1<=ai<=1000000,每个ai均不相同

题解

树状数组,枚举中间点。两边像取逆序对一样做即可。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<algorithm>
#define inf 1<<30
#define ll long long
#define MAXN 1000005
using namespace std;
int n,a[MAXN],maxs;
int tr[MAXN],p[MAXN],q[MAXN];
ll ans;
void init()
{
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
{scanf("%d",&a[i]);
maxs=max(maxs,a[i]);
}
}
int lowbit(int x) {return x&(-x);}
int find(int x)
{
int sum=0;
for(;x<=maxs;x+=lowbit(x)) sum+=tr[x];
return sum;
}
void insert(int x)
{
for(;x>0;x-=lowbit(x)) tr[x]++;
}
void work()
{
int i;
for(i=1;i<=n;i++)
{p[i]=find(a[i]+1);
insert(a[i]);
}
memset(tr,0,sizeof(tr));
for(i=n;i>0;i--)
{q[i]=n-i-find(a[i]+1);
insert(a[i]);
}
for(i=1;i<=n;i++) ans+=(ll)p[i]*q[i];
printf("%I64d\n",ans);
}
int main()
{
freopen("weakness.in","r",stdin);
freopen("weakness.out","w",stdout);
init(); work();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  树状数组