题目描述
有一个长度为 �n 的序列 �A 。此序列中的所有数字都不小于 11 且不大于 �n,并且此序列中的所有数字都不同。
请计算四边形(a,b,c,d)满足的数量
1、1≤�<�<�<�≤�1≤a<b<c<d≤n
2、��<��Aa<Ab
3、��<��Ac<Ad
输入描述
第一行包含单个整数 �T,指示测试用例的数量。
每个测试用例都以一行开头,其中包含一个整数 �n。
下一行跟在 �n 个整数 �1,�2,⋯,��A1,A2,⋯,An
输出描述
对于每个情况的输出,一行包含一个整数,即四边形的数目。
输入样例
15 1 3 2 4 5
输出样例
4
提示
全部数据:1≤�≤100,1≤�≤50000,1≤��≤�1≤T≤100,1≤n≤50000,1≤Ai≤n
代码
#include<bits/stdc++.h>
using namespace std;
int n,a[50005],b[50005],f[50005],g[50005],t,cntf[50005],cntg[50005],sumf[50005];
map<int ,int> ma;
int lowbit(int t){return t&(-t);}
void add(int cnt[],int x,int y){
for(int i=x;i<=n;i+=lowbit(i)) cnt[i]+=y;
}
long long query(int cnt[],int x){
long long ans=0;
for(int i=x;i;i-=lowbit(i)) ans+=cnt[i];
return ans;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>t;
while(t--){
cin>>n;
memset(cntf,0,sizeof cntf);
memset(cntg,0,sizeof cntg);
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
f[i]=query(cntf,a[i]);
add(cntf,a[i],1);
}
for(int i=n;i>=1;i--){
g[i]=query(cntg,n)-query(cntg,a[i]);
add(cntg,a[i],1);
}
for(int i=1;i<=n;i++){
sumf[i]=sumf[i-1]+f[i];
}
long long ans=0;
for(int i=1;i<=n;i++){
ans+=(long long)g[i]*sumf[i-1];
}
cout<<ans<<"\n";
}
return 0;
}
866

被折叠的 条评论
为什么被折叠?



