传送门
题意:
给两个数组a,b,问满足ai+aj>bi+bj (j>i)有几种?
思路
可将上面式子变形,(ai-bi)+(aj-bj)>0,令ci=ai-bi,问题转化为,从ci中选出两个数加起来大于0的即可(注意是组合不是排列)。解题步骤:
1.将ci进行排序。
2.当ci>0:进行计数num个,答案加上num*(num-1)/2,从num中选两个。
3.当ci<=0:找出第一个大于ci的绝对值的下标,答案加上n-i,(后面的都是满足条件的)。
AC代码
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN=2e5+5;
int a[MAXN],b[MAXN];
int main()
{
int n,ans=0;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=0;i<n;i++) scanf("%d",&b[i]);
for(int i=0;i<n;i++) b[i]=a[i]-b[i];
sort(b,b+n);
ll cnt=0,num=0;
for(int i=0;i<n;i++)
{
if(b[i]<=0)
{
int res=abs(b[i]);
int i=upper_bound(b,b+n,res)-b;
cnt+=n-i;
}
else num++;
}
cnt+=(num*(num-1)/2);
printf("%lld\n",cnt);
return 0;
}