注意二分边界情况,lower_bound()返回第一个大于等于待查找数的指针。
#include<iostream>
#include<cstring>
#include<algorithm>
#include <set>
#include <vector>
#include<cctype>
using namespace std;
int n;
int a[100100],b[100100],c[100100];
int bcnt[100100],ccnt[100100];
long long sumbcnt[100100];
long long ans;
int main(int argc, char const *argv[])
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
for(int i=1;i<=n;i++)cin>>c[i];
sort(a+1,a+1+n);
sort(b+1,b+1+n);
sort(c+1,c+1+n);
for(int i=1;i<=n;i++)
{
int tmp = lower_bound(a+1,a+1+n,b[i]) - a;
if(tmp>0)tmp--;
while(a[tmp]>=b[i])tmp--;
tmp = max(tmp,0);
//
//cout<<tmp<<" ";
bcnt[i] = tmp;
}
for(int i=1;i<=n;i++)
{
sumbcnt[i] = bcnt[i];
sumbcnt[i] += sumbcnt[i-1];
}
for(int i=1;i<=n;i++)
{
int tmp = lower_bound(b+1,b+1+n,c[i]) - b;
if(tmp>0)tmp--;
while(b[tmp]>=c[i])tmp--;
//cout<<tmp<<" ";
tmp = max(tmp,0);
ans+=sumbcnt[tmp];
}
cout<<ans<<endl;
system("pause");
return 0;
}