zoukankan      html  css  js  c++  java
  • 二分基础

    <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>

  • 相关阅读:
    一个应用程序无法启动错误的解决过程
    C#调用C库的注意事项
    STM32硬件调试详解
    CP2102模块介绍(USB转uart)
    CH340在STM32实现一键下载电路
    LM27313升压转换器
    常用贴片电阻、电容、电感封装
    MAX16054
    在51系列中data,idata,xdata,pdata的区别
    用UGN3503霍尔器件制作的数字指南针_电路图
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5036957.html
Copyright © 2011-2022 走看看