Examples
input
5
4 8 2 6 2
4 5 4 1 3
output
7
input
4
1 3 2 4
1 3 2 4
output
0
题意:
选择两列,使得上面两个值的和比下面两个值之和大。
解析:
令c[ i ] = a[ i ] - b[ i ],转换成选两个值,其和大于0
排序,然后二分
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int t,n,a[N],b[N],c[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
scanf("%d",&b[i]);
c[i]=a[i]-b[i];
}
sort(c+1,c+n+1);
long long cnt=0;
for(int i=1;i<=n;i++){
if(c[i]<=0) continue;
int l=1,r=n,t=-c[i]+1;
while(l<r){ //二分查找第一个大于等于-c[i]+1的值
int mid=l+r>>1;
if(c[mid]>=t) r=mid;
else l=mid+1;
}
cnt+=i-l;
}
printf("%lld",cnt);
return 0;
}