再次做这道题已经感觉到对二分算法应用的不熟练,特地写一篇博客来记录一下,没有练算法已经好几个月了,不知道是脑子的秀逗还是之前就没把这个算法给学好,估计之前都没把这个算法给学好,见代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
ll n;
cin>>n;
ll a[n],b[n],c[n];
for(ll i=0;i<n;i++){
cin>>a[i];
}
for(ll i=0;i<n;i++){
cin>>b[i];
}
for(ll i=0;i<n;i++){
cin>>c[i];
}
sort(a,a+n);
sort(b,b+n);
sort(c,c+n);
ll ans=0;
for(ll i=0;i<n;i++){
if(b[i]<=a[0]||b[i]>=c[n-1]) continue;
ll id1,id3;
ll left,right,mid;
left=0,right=n-1;
while(left<right){
mid=(left+right)/2;
if(a[mid]>=b[i]){
right=mid;
}
if(a[mid]<b[i]){
left=mid+1;
}
}
if(a[left]>=b[i]) id1=left-1;//这一步处理边界情况,上述二分算法是找a数组里面第一个大于等于b[i]的下标,但是如果a数组里面全都是小于b[i]的数,运算方式就不同
else id1=left;
left=0,right=n-1;
while(left<right){
mid=(left+right)/2;
if(c[mid]>b[i]){
right=mid;
}
if(c[mid]<=b[i]){
left=mid+1;
}
}
id3=left;
// cout<<id1<<" "<<id3<<endl;
ans+=(1+id1)*(n-id3);
}
cout<<ans;
}