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>

  • 相关阅读:
    关于IE缓存的解决方案(HTML,JSP,ASP,PHP,C#)(转)
    ASP.NET 2.0 中的客户端脚本
    Post和Get的区别(兼谈页面间传值的方式)(转)
    委托的小例子
    JS的正则表达式
    HTTP消息头
    asp.net一个onclick的全过程(简单写一下)
    location.reload() 和 location.replace()的区别和应用
    使用 .NET Framework 2.0 在您的应用程序中支持证书(转)
    页面动态注册脚本(小技巧)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5036957.html
Copyright © 2011-2022 走看看