• 二分基础


    <span style="color:#3333ff;">/*A - 二分法 基础
    Time Limit:15000MS     Memory Limit:228000KB     64bit IO Format:%I64d & %I64u
    Submit
     
    Status
    Description
    The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, compute how many quadruplet (a, b, c, d ) ∈ A x B x C x D are such that a + b + c + d = 0 . In the following, we assume that all lists have the same size n .
    Input
    The first line of the input file contains the size of the lists n (this value can be as large as 4000). We then have n lines containing four integer values (with absolute value as large as 2 28 ) that belong respectively to A, B, C and D .
    Output
    For each input file, your program has to write the number quadruplets whose sum is zero.
    Sample Input
    6
    -45 22 42 -16
    -41 -27 56 30
    -36 53 -37 77
    -36 30 -75 -46
    26 -38 -10 62
    -32 -54 -6 45
    Sample Output
    5
    Hint
    Sample Explanation: Indeed, the sum of the five following quadruplets is zero: (-45, -27, 42, 30), (26, 30, -10, -46), (-32, 22, 56, -46),(-32, 30, -75, 77), (-32, -54, 56, 30).
    By Grant Yuan
    2014.7.14
    二分
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    long long a[4002],b[4002],c[4002],d[4002];
    int n;
    long long num1[16000004];
    long long num2[16000004];
    int top;
    long long sum;
    int binary(long k,int left,int right)
    {
         int i;
        while(left<=right){
          int mid=(left+right)/2;
          int num=0;
               if(num2[mid]==k)
           {
             num=1;
             for(i=mid-1;i>=0&&num2[i]==k;i--)  num++;
             for(i=mid+1;i<n*n&&num2[i]==k;i++)  num++;
             return num;
          }
         else if(num2[mid]>k)
           right=mid-1;
          else left=mid+1;
       }
       return 0;
    
    }
    
    int main()
    {
        cin>>n;
        long long flag;
        for(int i=0;i<n;i++)
           cin>>a[i]>>b[i]>>c[i]>>d[i];
        top=-1;
        sum=0;
        for(int i=0;i<n;i++)
          for(int j=0;j<n;j++)
         {
             num1[++top]=a[i]+b[j];
             num2[top]=c[i]+d[j];
         }
         sort(num1,num1+top+1);
         sort(num2,num2+top+1);
         for(int i=0;i<=top;i++)
           {
               flag=-num1[i];
               sum+=binary(flag,0,top+1);
           }
           cout<<sum<<endl;
           return 0;
    }
    </span>

  • 相关阅读:
    工作流-1
    net core体系-Xamarin-2概要(lignshi)
    net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第二章 入门篇-快速入门ASP.NET Core看这篇就够了
    手机支持NFC
    net core体系-Standard-1概述
    运营-赵本山最近有点烦:二人转产业链滑铁卢 关联公司IPO预披露
    MSSql-1内部数据库版本号
    (JAVA保留小数问题,基础)Probability hdu2131
    (stripTrailingZeros)A == B hdu2054
    (reverse)Palindromes hdu2163
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5036957.html
Copyright © 2020-2023  润新知