题目描述
总结一下自己对此题的理解:
思路:首先其实就是一个 三个数组符合a[i]<b[j]<c[k]就行
菜鸟行为就是直接三个数组每次直接比较符合+1,也能出来样例的答案,
但是你要注意测试数据 太大了,直接超限。
进阶思路:新增一个数组存t[]中 存放比b[j]小的a[j]之前有多少个数(首先你得先排序)
然后去c数组中找比b[j]大的元素的个数,每次都移动b数组,找到就求sum
结果就是sum时间复杂度大大降低
最后就是一定要注意定义long long 数组如果定义int数组在计算过程中有超int的数据会出错,通不过所有数据
样例
3
1 1 1
2 2 2
3 3 3
27
C++ 代码
# include<iostream>
# include<algorithm>
# include<cstring>
using namespace std;
long long a[1000001],b[1000001],c[1000001],t[1000001];//此处设置了long long 类型
long long ans=0;
int main()
{
int n,i,j,k;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
cin>>b[i];
for(int i=0;i<n;i++)
cin>>c[i];
sort(a,a+n);
sort(b,b+n);
sort(c,c+n);
memset(t,0,sizeof(int)*n);
i=n-1,j=n-1;
while(i>=0&&j>=0)
{
if(a[i]<b[j])
{
t[j]=i+1;
j--;
}
else
i--;
}
j=0,k=0;
while(k<n&&j<n)
{
if(b[j]<c[k])
{
ans+=t[j]*(n-k);
//k++;
j++;
}
else
k++;
}
cout<<ans<<endl;
return 0;
}