链接: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;
}