您的位置:首页 > 其它

2016多校训练Contest5: 1012 World is Exploding hdu5792

2016-08-02 22:56 357 查看
Problem Description

Given a sequence A with length n,count how many quadruple (a,b,c,d) satisfies: a≠b≠c≠d,1≤a<b≤n,1≤c<d≤n,Aa<Ab,Ac>Ad.

 

Input

The input consists of multiple test cases. 

Each test case begin with an integer n in a single line.

The next line contains n integers A1,A2⋯An.
1≤n≤50000
0≤Ai≤1e9

 

Output

For each test case,output a line contains an integer.

 

Sample Input

4
2 4 1 3
4
1 2 3 4

 

Sample Output

1
0

一开始看错题了...然后又不小心取模计算了...各种挂

容易想到的是枚举b的位置

然后b1表示左边比它小的,b2表示右边比它小的,b3表示左边比它大的

sx表示一共可以选的cd总数

然后统计的时候假设当前是ai

那么我们只需要用(sx-b2[i]-b3[i])*b1[i]-左侧比它小的数在c的情况

最后那个可以用树状数组直接维护

#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct number
{
int x,p;
}a[100001];
inline bool cmp1(number x,number y)
{
return x.x<y.x;
}
inline bool cmp2(number x,number y)
{
return x.p<y.p;
}
int tr[100001];
inline int lowbit(int x)
{
return x&(-x);
}
inline void add(int l,int x)
{
int i;
for(i=l;i<=100000;i+=lowbit(i))
tr[i]=(tr[i]+x);
}
inline int sum(int x)
{
int i;
int sx=0;
for(i=x;i>=1;i-=lowbit(i))
sx+=tr[i];
return sx;
}
int f[100001],fx[100001];
long long b1[100001],b2[100001],b3[100001],b4[100001];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i].x);
a[i].p=i;
}
sort(a+1,a+1+n,cmp1);
int tot=1;
f[tot]=a[1].x;
fx[a[1].p]=tot;
for(i=2;i<=n;i++)
{
if(a[i].x==a[i-1].x)
fx[a[i].p]=tot;
else
{
tot++;
f[tot]=a[i].x;
fx[a[i].p]=tot;
}
}
memset(b1,0,sizeof(b1));
memset(b2,0,sizeof(b2));
memset(b3,0,sizeof(b2));
memset(tr,0,sizeof(tr));
sort(a+1,a+1+n,cmp2);
for(i=1;i<=n;i++)
{
b1[i]=sum(fx[i]-1);
add(fx[i],1);
}
memset(tr,0,sizeof(tr));
long long sx=0;
for(i=n;i>=1;i--)
{
b2[i]=sum(fx[i]-1);
sx=(sx+b2[i]);
add(fx[i],1);
}
memset(tr,0,sizeof(tr));
for(i=1;i<=n;i++)
{
b3[i]=sum(n)-sum(fx[i]);
add(fx[i],1);
}
sort(a+1,a+1+n,cmp1);
long long ans=0;
memset(tr,0,sizeof(tr));
for(i=1;i<=n;i++)
{
add(fx[i],b2[i]+b3[i]);
long long tmp=sx-b3[i]-b2[i];
long long tx=sum(fx[i]-1);
ans=(ans+b1[i]*tmp-tx);
}
printf("%I64d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: