Codeforces Round #627 (Div. 3) D—D. Pair of Topics

链接:http://codeforces.com/contest/1324/problem/D

(一个傻逼水题,活生生的被我搞废了)

题意:

有n节课,每节课都有a[i]和b[i]属性,问你满足i>j,a[i]+a[j]>b[i]+b[j]的组有多少

思路:

化简不等式:a[i] - b[i] > -(a[j] - b[j]),然后用c数组存放-(a[j] - b[j]),排序后,对每一个i对应的a[i] - b[i],都在c数组里面找到第一个大于等于它的数的位置下标;需要注意的是,当a[i] - b[i]大于0的时候,会把自身也算进去,这时候减1即可;最后结果除以2;

我做的时候也想到了二分,但是没想到怎么处理 i < j 这个条件限制;后来看了别人的原来直接把结果除以2就行了,因为对于一对数,如果 a[i] - b[i] > -(a[j] - b[j]),那么反过来a[j] - b[j] > -(a[i] - b[i]),所以最终结果除以2就能解决这个问题;

(结果要用 long long 表示)

#include <bits/stdc++.h>
using namespace std;
const int N=200005;
int a[N],c[N],b[N];
typedef long long ll;
int main()
{
	ll n,ans=0;
	cin >>n;
	for(int i=0;i<n;i++) cin >>a[i];
	for(int i=0;i<n;i++) cin >>b[i];
	for(int i=0;i<n;i++) c[i]=b[i]-a[i];
	sort(c,c+n);
	for(int i=0;i<n;i++)
	{
		int x=a[i]-b[i];
		ll pos=lower_bound(c,c+n,x)-c;
		if(a[i]-b[i]>0) pos--;
		ans+=pos;
	}
	cout <<ans/2<<endl;
}
发布了217 篇原创文章 · 获赞 49 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_43872728/article/details/104876827
今日推荐