二分Pair of Topics

Posted osea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分Pair of Topics相关的知识,希望对你有一定的参考价值。

【题目链接】:传送门

技术图片

 

 

 


 

 

【题意】

  给定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)
",i,i-j);
26         }
27     }
28     printf("%lld
",ans);
29     return 0;
30 }
具体代码

 

以上是关于二分Pair of Topics的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #627 (Div. 3) D. Pair of Topics(二分/直接遍历)

[Codeforces] 1324-D Pair of Topics

D - Pair of Topics

Codeforces - 1324D - Pair of Topics(尺取)

D. Pair of Numbers (ST表&二分&双指针)

LeetCode Maximum Length of Pair Chain