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
















![【PWN · 栈迁移】[BUUCTF]ciscn_2019_es_2](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4f7d2562-49df-4956-9ae7-8351c56d1820/Untitled.png)

