程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 2785 4 Values whose Sum is 0(二分)

POJ 2785 4 Values whose Sum is 0(二分)

編輯:C++入門知識

4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 14089 Accepted: 3975 Case Time Limit: 5000MS

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


跟以前一個題目很相似,不過那個有五堆,枚舉一二堆合並堆,三四堆合並堆,然後再二分第五堆。這個直接將前兩堆合並為1堆,後兩堆合並為一堆,枚舉第一堆,二分第二堆。
分析時間復雜度,O(4000*4000*log2(4000*4000)),不過這個是最優的時候,二分的代碼寫得並不好,找到邊界之後需要遍歷,然後依次再移動,假如合並之後a和b全為0,那時間復雜度就遠遠不止這點了。變為了O(10^14)........數據比較水。每次二分找的時候可以加個標記,這樣時間復雜度會降下來,自己就沒實現這個了。。空間也給了很大,幾千萬的數組是妥妥可以放的。
題目地址:4 Values whose Sum is 0
AC代碼:
#include
#include
#include
using namespace std;
int a[16000005];    //第一堆
int b[16000005];    //第二堆
int p[4005][4];
int t;

int erfen(int x)
{
    int cnt=0;
    int l=0,r=t-1,mid;
    while(r>l)
    {
        mid=(l+r)>>1;
        if(b[mid]>=x) r=mid;
        else l=mid+1;
    }

    while(b[l]==x&&l>n)
    {
        res=0;
        for(i=0;i

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved