这题很简单,双指针。但是有两个小坑和一个大坑
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
const int N = 1E5+10;
typedef long long ll;
int n;
int a[N],b[N],c[N];
int main ()
{
cin>>n;
for(int i = 1;i<=n;++i)cin>>a[i];sort(a+1,a+1+n);
for(int i = 1;i<=n;++i)cin>>b[i];sort(b+1,b+1+n);
for(int i = 1;i<=n;++i)cin>>c[i];sort(c+1,c+1+n);
int up = 1;int down =1;ll ou = 0;
for(int i = 1;i<=n;++i){
int nu1 =0;int nu2 = 0;
while(a[up+1]<b[i]&&up<n){//坑三:未考虑数组下标到n+1
up++;
}
while(c[down]<=b[i]&&down<n){
down++;
}
nu1 =up;nu2 = n-down+1;
//坑一;未考虑c无值的情况
if(c[down]<=b[i]){
nu2 =0;
}
//坑二:未考虑a无值的情况
if(a[up]>=b[i]){
nu1 =0;
}
ou+=nu2*(ll) nu1;//坑三:(ll)(a*b)
}
cout<<ou;
return 0;
}
坑三:
区别
(ll) a*b //这里把a的精度提高到ll,乘以int最后的结果也是ll
(ll)(a*b)//这里先算a*b,如果超出int范围后,结果已经错误,再转为int已经来不及了
(ll)a*(ll)b//这里将a和b都化为ll类型,不损失精度