【题目链接】:传送门
【题意】
给定A[],B[],请问有多少对ai+aj > bi + bj ,i < j
【题解】
问题先分析,可以通过推导得到:
(ai - bi) + ( aj - bj ) > 0
Ci + Cj > 0
Cj >= -Ci + 1
我们可以通过排序,(为什么呢?其原因是因为找一对,所有对子都是相对的,张三和李四,李四和张三指的都是同一对)
因为C的值有正负之分,我们只取大于0的部分来算,通过式子Cj >= -Ci + 1 在枚举i的位置时,计算出J。对于答案的贡献就是i-j。
以此计算C值得:0,3,-2,5,-1
排序后得到: -2,-1,0,3,5
枚举每一个 “i” 的位置,通过Cj >= -Ci + 1 ,找到J的位置
通过二分得到即可。
上面对答案的贡献为:0,0,0,3,4。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N = 2e5+10; 6 typedef long long ll ; 7 int a[N],b[N],c[N],n; 8 int main() 9 { 10 scanf("%d",&n); 11 for( int i = 0 ; i < n ; i++ ){ 12 scanf("%d",&a[i]); 13 } 14 for( int i = 0 ; i < n ; i++ ){ 15 scanf("%d",&b[i]); 16 c[i] = a[i] - b[i]; 17 } 18 sort( c , c + n ); 19 ll ans = 0 ; 20 for( int i = 0 ; i < n ; i++ ){ 21 if( c[i] <= 0 ) continue ; 22 else{ 23 int j = lower_bound( c , c + n , -c[i] + 1 ) - c ; 24 ans += i - j ; 25 //printf("( %d , %d)\n",i,i-j); 26 } 27 } 28 printf("%lld\n",ans); 29 return 0; 30 }
具体代码
原文地址:https://www.cnblogs.com/Osea/p/12562750.html
时间: 2024-10-04 22:23:16