cf--contest1324:D. Pair of Topics+二分

传送门

D. Pair of Topics

题意:

给两个数组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;
}
发布了67 篇原创文章 · 获赞 1 · 访问量 1308

猜你喜欢

转载自blog.csdn.net/qq_45249273/article/details/104834236