zoukankan      html  css  js  c++  java
  • 【二分】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 }
    具体代码
  • 相关阅读:
    记一下后续要看的点
    vue 封装request.js
    shuf命令简单用法
    Redis string 字符串
    Redis 事务操作
    Redis Zset 有序集合
    php操作redis的一些基本操作
    pytest自动化测试入门介绍
    idea&myeclipse 自动生成serialVersionUID
    leetCode1104. 二叉树寻路(medium)
  • 原文地址:https://www.cnblogs.com/Osea/p/12562750.html
Copyright © 2011-2022 走看看