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;
}