码迷,mamicode.com
首页 > 其他好文 > 详细

【二分】Pair of Topics

时间:2020-03-24 23:30:07      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:就是   cst   gif   pre   lap   onclick   tps   tar   contest   

【题目链接】:传送门

技术图片

 

 

 


 

 

【题意】

  给定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 }
具体代码

 

【二分】Pair of Topics

标签:就是   cst   gif   pre   lap   onclick   tps   tar   contest   

原文地址:https://www.cnblogs.com/Osea/p/12562750.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!